该题目的难点在于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太大了,递归深度过大,使栈溢出将不能得到解答。而文章开头的第一种思路则和系统当时所能分配的空间大小决定,我认为这种思路的效率高于递归实现,因为递归实现其实也是在做++运算,加上递归的耗费,自然就慢了。
原文地址:http://blog.csdn.net/liao_jian/article/details/44986551