剑指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还提到了全排列的方法,有兴趣的读者自行参考
作者:vpoet
出处:http://www.cnblogs.com/vpoet/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
出处:http://www.cnblogs.com/vpoet/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。