题目描述
输入数字n,按照顺序打印出从1到最大的n位十进制数。
样例
输入
2
输出
1~9之间的所有整数
思路
《剑指offer》P94
很容易想到定义一个整型数字,依次加1并输出,但是这种情况,当输入的n
很大时会造成溢出。
因此,考虑用字符串来保存所有位上的数字,然后模拟加法。
注意的问题:
- 进位
- 到达最高位时的处理
- 输出时,不输出高位上的0,如值为
01
则输出1
code
非递归
class Solution {
public:
void Print1ToMaxOfN(int n) {
if (n < 0)
return;
// 构造一个字符串保存数字
char *number = new char[n + 1];
memset(number, '0', n);
number[n] = '\0';
while (!Increment(number))
PrintNumber(number);
}
bool Increment(char *number) {
bool isOverFlow = false; // 记录是否溢出
int nTakeOver = 0;
int nLength = strlen(number);
for (int i = nLength - 1; i >= 0; i --) {
int nSum = number[i] - '0' + nTakeOver; // 转为数字,加上进位
// 如果当前在个位,则加一
if (i == nLength - 1)
nSum ++;
// 判断是否有进位
if (nSum >= 10) {
// 进位已经溢出
if (i == 0) {
isOverFlow = true;
break;
}
nTakeOver = nSum/10; // 保存进位
nSum -= 10; // 保存当前值
number[i] = nSum + '0'; // 转换成字符形式
}
else {
number[i] = nSum + '0'; // 转换成字符形式
break;
}
}
return isOverFlow;
}
void PrintNumber(char *number) {
bool printZero = false;
int nLen = strlen(number);
for (int i = 0; i < nLen; i ++) {
if (number[i] > '0' && number[i] <= '9'){
cout << number[i];
printZero = true;
}
if (number[i] == '0' && printZero)
cout << number[i];
}
cout << endl;
}
};