题目描述:
输入数字n,按顺序打印出从1最大的n位十进制数。比如输入3,则打印出1、2、3一直到最大的3位数即999。
解题思路:
因为题目没有说明数在什么范围内,所以这是一个大数问题,模拟加一或者用全排列来做
解法一:
void Print1ToMaxOfNDigits(int n)
{
if(n<=0) return;
int num[n];
memset(num,0,sizeof(num));
while(!AddOne(num,n))
{
PrintNumber(num,n);
}
}
bool AddOne(int *number, int n)//模拟+1
{
bool isOverflow=false;//是否加1后超过n位数
int TakeOver=0;//进位
for(int i=n-1;i>=0;i--)
{
int NumTemp=number[i]+TakeOver;// 每位计算过后的值
if(i==n-1) NumTemp++;
if(NumTemp>=10)
{
if(i==0) isOverflow=true;//如果第一位进位了,表示超过n位数
else
{
NumTemp-=10;
TakeOver=1;
number[i]=NumTemp;
}
}
else
{
number[i]=NumTemp;
break;
}
}
return isOverflow;
}
void PrintNumber(int *number,int n)
{
bool BeginZero=true;
for(int i=0;i<n;i++)
{
if(BeginZero&&number[i]!=0) BeginZero=false;
if(!BeginZero) printf("%d",number[i]);//从第一个不为0的开始输出
}
printf(" ");
}
解法二:
可以将这些数字看成n个0~9数字的全排列,全为0的不输出正好是1~最大的n位数
void Print1ToMaxOfNDigits_2(int n)
{
if(n<=0) return;
int num[n];
memset(num,0,sizeof(num));
for(int i=0;i<10;i++)
{
num[0]=i;
Arrange(num,n,1);
}
}
void Arrange(int *number,int n,int index)
{
if(index==n)
{
PrintNumber(number,n);
return;
}
for(int i=0;i<10;i++)
{
number[index]=i;
Arrange(number,n,index+1);
}
}
void PrintNumber(int *number,int n)
{
bool BeginZero=true;
for(int i=0;i<n;i++)
{
if(BeginZero&&number[i]!=0) BeginZero=false;
if(!BeginZero) printf("%d",number[i]);//从第一个不为0的开始输出
}
printf("\t");
}