您的位置:首页 > 职场人生

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

2016-04-07 20:20 507 查看
题目:输入数字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
='\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还提到了全排列的方法,有兴趣的读者自行参考

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: