面试题之【打印1到最大的N位数】

题目描述:给定一个数字N,打印从1到最大的N位数。

看起来像是很简单的问题(虽然实际也不是很难。。。)我们很容易写出这样的代码:

 1 #include<iostream>
 2 #include<cstdio>
 3  
 4 int a[]={9,99,999,9999,99999};
 5 using namespace std;
 6 int main()
 7 {
 8     int N;
 9     cin>>N;
10     for(int i=1;i<=a[N-1];i++)
11     {
12         printf("%d
",i);
13     }
14  
15 }

但是这样还是有不少问题的,说的简单点这个N很大怎么办?你的程序还能运行吗?也就是说在范围不明确的情况下这可能是一个大数问题,大数的最简单解决方式是Java的BigInternet,但是C++里没有这个类(感觉好不符合时代潮流啊,估计快加上了吧)。于是我们要自己用字符串模拟,很简单就跟小学算算术一样,直接上代码:

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 long long a[]={9,99,999,9999,99999,999999,9999999};
 5 char c[100];
 6 void add()
 7 {
 8     c[99]++;
 9     for(int i=99;i>=0;i--)
10     {
11         if(c[i]=='9'+1)
12         {
13             c[i]='0';
14             c[i-1]++;
15         }
16         //else
17         //{
18             //c[i]++;
19         //}
20     }
21  
22     bool flg=false;
23     for(int i=0;i<100;i++)
24     {
25         if(c[i]!='0')
26         {
27             flg=true;
28             printf("%c",c[i]);
29         }
30         else
31         {
32             if(flg)
33             {
34                 printf("0");
35             }
36         }
37     }
38     printf("
");
39 }
40  
41 void print(int N)
42 {
43     memset(c,'0',sizeof(c));
44     for(int i=1;i<=N;i++)
45     {
46         add();
47     }
48 }
49 using namespace std;
50 int main()
51 {
52     int N;
53     cin>>N;
54     print(a[N-1]);
55     return 0;
56 }

顺便说几句对面试的这类题的一点想法吧,其实不管是笔试面试都会有这么一些考查程序稳定性的题目,也即是说给你那么个看似很简单的问题,看似是随意就能写出代码,但实际上就各种陷阱。这个只能是我们自己小心了,考虑要各种全面,能问的情况就尽量问清楚,对数据量、异常什么的要一百二十个小心。也是提醒自己小心吧。。。

原文地址:https://www.cnblogs.com/MrLJC/p/3658480.html