输入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; ++i){
number[index + 1] = '0' + i;
GenerateNumberRecursively(number, length, index + 1);
}
}
void Print1toMax(int n){
if (n <= 0) return;
char* number = new char[n + 1];
number[n] = '\0';
for (int i = 0; i < 10; ++i){
number[0] = i + '0';
GenerateNumberRecursively(number, n, 0);
}
delete[] number;
}
void main(int argc, char* argv[])
{
Print1toMax(3);
system("pause");
}

输入n,程序需打印1到n位的最大数字之间的所有整数。由于n可能超过long long的范围,解决方案包括使用字符数组模拟加1操作,或者递归遍历所有可能的数字排列。本文提供了递归方法的C++代码实现。

4989

被折叠的 条评论
为什么被折叠?



