输入n,要求打印从1开始到n位最大数字之间(包含两端)的所有整数。此题有陷阱,需要注意到n可能很大,超过long long表示的范围,所以解决方法有2个:
1. 用一个字符数组存储数字,模拟整数加1操作,从0开始,每次加1后打印一个数字,直到打印完毕。这里判断何时已经打印完毕有一点技巧,最高位如果有进位,则表示已经打印了n位最大数字,此时需要终止。
2.采用递归方法,每个数字可以看成0-9的一个全排列,我们用递归的方法遍历所有的排列即可。
下面是第二种方法实现的c++代码:
#include <iostream>
using namespace std;
void PrintNumber(char* number, int length){
bool start = false;
for (int i = 0; i < length; ++i){
if (start == false && number[i] != '0')
start = true;
if (start)
printf("%c", number[i]);
}
printf("\n");
}
void GenerateNumberRecursively(char* number, int length, int index){
if (index == length - 1){
PrintNumber(number, length);
return;
}
for (int i = 0; i < 10; +&