該題目的難點在於n可能很大,超過了整數表示的範圍,所以一般有兩種思路,一種是用字符串表示整數,並實現++操作符,另一種是把該題目當做排列組合來做,使用遞歸可以實現,下面給出使用遞歸實現的代碼:
void __print(char digit_array[], int index, int n)
{
if (index < 0) return;
if (index == n - 1)
{
digit_array[index] = '0';
//從0開始
for (int i = 0; i < 10; ++i)
{
digit_array[index] = i + '0';
cout << digit_array << endl;
}
return;
}
//這是爲了在打印是不會像出現0012這樣的情況,
//但是又要保證像1002這種情況的出現。
//整個字符數組開始使用‘ ’(空格)初始化的
if (digit_array[index] != ' ')
digit_array[index] = '0';
__print(digit_array, index + 1, n);
//從1開始,該位爲0時,由上一句負責
for (int i = 1; i < 10; ++i)
{
digit_array[index] = i + '0';
__print(digit_array, index + 1, n);
}
}
void PrintN(int n)
{
char *digit_array = new char[n + 1];
for (int i = 0; i < n; ++i)
{
digit_array[i] = ' ';
}
digit_array[n] = '\0';
//從第一位開始遞歸
__print(digit_array, 0, n);
delete[]digit_array;
}
測試代碼:
#include "stdafx.h"
#include <iostream>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
PrintN(4);
return 0;
}
程序運行截圖:
使用遞歸可以打印出很大的數,具體和系統分配的棧空間大小有關,n太大了,遞歸深度過大,使棧溢出將不能得到解答。而文章開頭的第一種思路則和系統當時所能分配的空間大小決定,我認爲這種思路的效率高於遞歸實現,因爲遞歸實現其實也是在做++運算,加上遞歸的耗費,自然就慢了。