题目:输入数字n 按顺序打印出从1最大的n为十进制数 比如输入3 则打印出1 2 3 一直到最大的3位数即999
考虑到大数 应当使用字符串打印数字
何时打印停止 可以使用strcmp与n位最大的数9999...9比较 但每次比较时间复杂度为O(N)
只有999....9加1时高位才会产生进位 因此可以判断最高位是否有进位来控制打印停止
bool isover(char *a)
{
bool flag=true;
int nflag=0;
int len=strlen(a);
int t=0;
for(int i=len-1;i>=0;i--)
{
if(i==len-1)
t=a[i]-'0'+nflag+1;
else
t=a[i]-'0'+nflag;
if(t>9)
{
if(i==0)
{
flag=false;
}
else
{
nflag=1;
a[i]=t-10+'0';
}
}
else
{
a[i]=t+'0';
break;
}
}
return flag;
}
void print_number(char *a)
{
int i=0;
bool flag=false;
while(a[i]!='\0')
{
if(a[i]!='0' && !flag)
flag=true;
if(flag)
cout<<a[i];
i++;
}
cout<<' ';
}
-------------------------------------------
换个角度 如果打印1到n位的最大数 每一位都是0-9的数字 因此可以看做是n个数字(0-9的数字的)全排列 打印时 数字以0开头 不打印0
因此可以用递归的办法
从最高位开始 递归的打印
void recursion(char *a,int n)
{
if(n==strlen(a)-1)
{
print_number(a);
return;
}
else
{
for(int i=0;i<=9;i++)
{//递归打印n后面位数上的数字~~~~
a[n+1]=i+'0';
recursion(a,n+1);
}
}
}
void maxnumber(char *number)
{
//从number[0]开始 该位的数字从0-9 接着number[1] 该位的数字从0-9 。。递归到最后一位打印该数字
for(int i=0;i<=9;i++)
{
number[0]='0'+i;
recursion(number,0);
}
}