打印1到最大的N位数
输入数字n,顺序打印出从1到最大N位的十进制数。如输入3,则打印1,2,3到999.
这里设计一个大数问题,如果能很大,大到long long都会溢出,那么改怎么办。最常用的办法是用字符串或者数组来表达大数.
接下来一步步来实现。
首先解决打印问题,我们用字符串来表示数字,那么假如存着001,002那么我们是要处理前面的0的。
void PrintNumber(char* number) { bool isBeginning0 = true; int length = strlen(number); for(int i = 0; i < length; ++i) { if( isBeginning0 && number[i] == '0') { isBeginning0 = false; continue; } cout<<number[i]; } cout<<endl; }
解决了打印问题,现在就是实现数字的递增。如何判断数字什么时候到达最大呢,可以判断数字的最高位是否产生了进位。
bool Increment(char* number) { bool isOverflow = false;//用来表示数字是否到达最大。 int nTakeOver = 0 ; //用来表示是否产生进位 int length = strlen(number); for(int i =length-1; i >= 0 ; --i) { int sum = number[i]-'0' +nTakeOver; //只有处理个位数时才加一; if( i == length -1 ) sum++; if( sum >=10)//要产生进位了 { if( i ==0 )//在最高位产生进位 { isOverflow = true; } else //其他位置产生进位 { sum -=10; nTakeOver = 1; number[i] = '0' + sum; } } else { number[i] = '0' +sum; break; //如果没有产生进位,停止循环。 } } return isOverflow; }
这样主要功能就完成了,组装下:
void Print1ToMaxOfNDigits(int n) { if( n< 0) return; char* number = new char[n+1]; memset(number,'0',n); number[n]='\0'; while (! Increment(number)) { PrintNumber(number); } delete []number; }

浙公网安备 33010602011771号