注意:需考虑大数问题
方法一:
void PrintFrom1ToMax(int n)
{
if (n <= 0)
return;
char* arrPrintStr = new char[n+1];
memset(arrPrintStr, '0', n);
arrPrintStr[n] = ' ';
while (!Increment(arrPrintStr))
{
PrintNumber(arrPrintStr);
}
delete []arrPrintStr;
}
bool Increment(char* arrNumber)
{
bool bIsOverflow = false;
int nTakeOver = 0;
int nLength = strlen(arrNumber);
for (int i = nLength - 1; i >= 0; i--)
{
int num = arrNumber[i] - '0' + nTakeOver;
if (i == nLength - 1)
num++;
if (num >= 10)
{
if (i == 0)
bIsOverflow = true;
else
{
num -= 10;
nTakeOver = 1;
arrNumber[i] = '0' + num;
}
}
else
{
arrNumber[i] = '0' + num;
break;
}
}
return bIsOverflow;
}
void PrintNumber(char* arrNumber)
{
bool bStartPrint = false;
int nLength = strlen(arrNumber);
for (int i = 0; i < nLength; ++i)
{
if (!bStartPrint && arrNumber[i] != '0')
bStartPrint = true;
if (bStartPrint)
printf("%c", arrNumber[i]);
}
}
方法二(递归):
void PrintFrom1ToMax(int n)
{
if (n <= 0)
return;
char* arrNumber = new char[n + 1];
arrNumber[n] = ' ';
for (int i = 0; i < 10; ++i)
{
arrNumber[0] = i + '0';
PrintFrom1ToMaxRecursively(arrNumber, n, 0);
}
delete []arrNumber;
}
void PrintFrom1ToMaxRecursively(char* arrNumber, int length, int index)
{
if (index == length - 1)
{
PrintNumber(arrNumber);
return;
}
for (int i = 0; i < 10; ++i)
{
arrNumber[index + 1] = i + '0';
PrintFrom1ToMaxRecursively(arrNumber, length, index + 1);
}
}