剑指offer-面试题12.打印1到最大的n位数

题目:输入数字n,按照打印出从1最大的n位10进制数。比如3,则

打印出1、2、3一直到最大的3位数即999

 

1.你觉得如果面试会有这么简单的题,那

只能说明你---太天真。

2.n=3尚可,如果n=30 300呢有这样的内置数据类型

能包括这么大的数吗?

3.说白了,这道题就是考察用字符串模拟大数。

 

 

算法思想如下:

1.分配大小为n+1个字符的内存 初始化为'0' 最后一个'\0'

2.模拟加法,每一位字符上的范围为'0'-'9'当超过之后进位,

3.结束条件,当第一位字符发生进位时说明已经遍历到最大了,结束

 

 

代码如下:

 1 #include <iostream>

 2 using namespace std;

 3 

 4 bool add(char *nums);

 5 void Print1ToMaxOfNDigits(int n)

 6 {

 7     if(n<=0)

 8         return;

 9 

10     char *nums=new char[n+1];

11     memset(nums,'0',n);

12     nums[n]='\0';

13     

14     int jinwei=0;

15     bool overflag=false;

16 

17     while(!add(nums))

18     {

19         int flag=0;

20         for(int i=0;i<n;i++)

21         {

22             if(nums[i]!=0||flag)

23             {

24                 flag=1;

25                 cout<<nums[i];

26             }

27         }

28         cout<<endl;

29     }

30 

31     return;

32 }

33 

34 bool add(char *nums)

35 {

36     int len=strlen(nums);

37     bool ismax=false;

38     int jinwei=0;

39 

40     for(int i=len-1;i>=0;i--)

41     {

42         int temp=nums[i]-'0'+jinwei;

43         if(i==len-1)

44             temp++;

45 

46         if(temp>=10)

47         {

48             if(i==0)

49             {

50                 ismax=true;

51             }

52             else

53             {

54                 temp=temp-10;

55                 jinwei=1;

56                 nums[i]='0'+temp;

57             }

58         }

59         else

60         {

61             nums[i]=temp+'0';

62             break;

63         }

64     }

65 

66     return ismax;

67 }

68 

69 int main(int argc, char* argv[])

70 {

71     int n;

72     cout<<"Please input the n: ";

73     cin>>n;

74     Print1ToMaxOfNDigits(n);

75     return 0;

76 }

运行结果:

剑指offer-面试题12.打印1到最大的n位数

 

当然剑指Offer还提到了全排列的方法,有兴趣的读者自行参考

你可能感兴趣的:(面试题)