题目:输入数字n,按顺序打印出从1到最大的n位十进制数。比如输入3,则打印1,2,3,4,5一直到最大的3位数999。
思路:看到题目的第一反应,应该是想到先把这个最大的数给找出来,然后在从1一直输出到这个数。
void printToMax(int n)
{
int maxNum = 1;
for(int i = 0; i < n; ++i)
{
maxNum = 10 * maxNum;
}
for(int i = 1; i < maxNum; ++i)
{
cout<<i<<endl;
}
}
所以我们需要换一个策略,可以用字符串来存储,用字符串来模拟整数的加法过程。
int main(int argc, const char * argv[]) { int n = 9; char *number = new char[n + 1]; memset(number, '0', n+1); number[n] = '\0'; while(!increment(number)) { printnumber(number); } delete[] number; return 0; }
increment()实现模拟整数递增的功能,printnumber()实现显示的功能。
bool increment(char *s) //将字符串看成整数 实现递增 { int length = strlen(s); int nTakeover = 0; bool isOverflow = false; //是否到达了最高n位整数 for(int i = length - 1; i >= 0; i--) { int nSum = s[i] - '0' + nTakeover; //nSum为整数 不是char型 if(i == length - 1) nSum++; //第一次循环时 最后一位数+1 if(nSum >= 10) //当nSum>=10时 说明此位需要进位 { if(i == 0) //当i=10时 说明第一位也需要进位 说明这个时候已经到达了n位最大数 循环到此结束 返回1 { isOverflow = true; break; } else { nTakeover = 1; //当i!=0时 说明时中间的位数需要进位 使进位标识为1 s[i] = '0'; //将进位的此为置为0 } } else { s[i] = '0' + nSum; //如果此位没有进行进位 那么前面的位数也不可能进位 所以到这里直接break break; } } return isOverflow; }
void printnumber(char *s) //从第一个非0位开始输出 { int length = strlen(s); int flag = 0; for(int i = 0; i < length; i++) { if(s[i] == '0' && flag==0) { continue; } flag = 1; cout<<s[i]; } cout<<endl; }