打印1到最大的n位数

题目:输入数字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);
	}
}

 




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值