此题看上去很简单,但要考虑大数问题,所以采用定义一个char数组,如n为3,则定义一个number[4]就可以了,下面是一种算法,采用递归和非递归,递归是全排列算法。
#include<iostream>
#include<string.h>
using namespace std;
bool Increment(char* number);
void PrintNumber(char* number);
void Print1ToMaxOfN_2Recursively(char *number,int length,int index);
void text(int n);
void Print1ToMaxOfN_1(int n)
{
if (n<=0)
throw 1;
char *number=new char[n+1];
memset(number,'0',n);
number[n]='\0';
while(!Increment(number))
{
PrintNumber(number);
}
delete []number;
}
bool Increment(char* number)
{
int TakeOver=0;
bool isOver=false;
int length=strlen(number);
for(int i=length-1;i>=0;i--)
{
int sum=number[i]-'0'+TakeOver;
if(i==length-1)
sum++;
if(sum>=10)
{
if(i==0)
{
isOver=true;
return isOver;
}
else
{
sum-=10;
TakeOver=1;
number[i]='0'+sum;
}
}
else
{
number[i]='0'+sum;
break;
}
}
return isOver;
}
//递归实现
void Print1ToMaxOfN_2(int n)
{
if(n<=0)
throw 1;
char *number=new char[n+1];
number[n]='\0';
for(int i=0;i<10;i++)
{
number[0]=i+'0';
Print1ToMaxOfN_2Recursively(number,n,0);
}
delete []number;
}
void Print1ToMaxOfN_2Recursively(char *number,int length,int index)
{
if(index==length-1)
{
PrintNumber(number);
return;
}
for(int i=0;i<10;i++)
{
number[index+1]=i+'0';
Print1ToMaxOfN_2Recursively(number,length,index+1);
}
}
//打印函数
void PrintNumber(char* number)
{
bool isBeginning0=true;
int length=strlen(number);
for(int i=0;i<length;i++)
{
if(number[i]!='0'&&isBeginning0)
isBeginning0=false;
if(!isBeginning0)
{
cout<<number[i];
}
}
cout<<" ";
}
void test(int n)
{
try
{
cout<<"非递归解法"<<endl;
Print1ToMaxOfN_1(n);
cout<<endl;
cout<<"递归解法"<<endl;
Print1ToMaxOfN_2(n);
cout<<endl;
}
catch(...)
{
cout<<"n必须大于0";
}
}
int main()
{
test(1);
test(2);
test(3);
test(-1);
return 0;
}