剑指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还提到了全排列的方法,有兴趣的读者自行参考

posted @ 2015-07-23 19:52  vpoet  阅读(305)  评论(0编辑  收藏  举报