问题重述:
题目:输入数字n,按顺序打印出从1到最大的n位十进制数,比如输入3,则打印出1,2,3一直到最大的三位数即999.
思路解析:
对于本问题能实现的方法很多,比如可以用循环实现,但是如何保存数据是一个很大的问题。由于题目并没有限定数据的位数,因此我们使用一般的数据类型(int ,long,long long),很容易造成溢出。因此,不妨将开辟一个限定长度的char数组,用以保存数据。
那么得到全部的数字呢,我们可以在数组上来进行加法的模拟,每次加1,直到加到最大的n位数,但是这种方法比较繁杂,需要的代码量大。还有一种方法,就是全排列。例如n为2,则有如下操作。
代码实现:
void fullPermutationAfterIndex(char* number, int length, int index);
//给定位数n
void printOneToMaxOfNDigits(int n)
{
assert(n > 0);
char* number = new char[n + 1];
number[n] = '\0';
for (int i = 0; i < 10;++i)
{
number[0] = i + '0';
fullPermutationAfterIndex(number, n, 0);
}
delete[] number;
}
//全排列的实现
void fullPermutationAfterIndex(char *number,int length,int index)
{
if (index == length - 1)
{
for (int i = 0; i < length; ++i)
{
cout << number[i];
}
cout << endl;
return;
}
for (int i = 0; i < 10; ++i)
{
number[index + 1] = i + '0';
fullPermutationAfterIndex(number, length, index + 1);
}
}