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