17.打印从1到最大的n位数

题目:输入数字n,按顺序打印出从1到n位最大十进数的数值。比如输入3,则打印出1、2、3一直到最大三位数即999。

基本思路:

解法一:用数组存储大数,首先初始化为0,然后为每一个数组元素表示的数字加1,再打印出来。因此我们只需要做两个事情:一是在数组表达的数字上模拟加法;二是:把数组表达的数字打印出来;

解法二:如果我们在数字前面补0,就会发现n位所有十进制其实就是n个从0到9的全排列。也就是说,我们把数组的每一位都从0到9排列一遍,就得到所有的十进制数。只是在打印的时候,排在前面的0就不打印出来罢了。

解法一Java实现:

public class Print1ToMax {
	
	private void Print1ToMaxOfDigits(int n) {
		if(n<=0)
			return;
		int[] number=new int[n];
		for(int i=0;i<number.length;i++) {//初始化数组为0
			number[i]=0;
		}
		while(!Increment(number)) {//当没溢出,则打印
			PrintNumber(number);
		}
	}

	private void PrintNumber(int[] number) {
		// TODO Auto-generated method stub
		int len=number.length;
		boolean is0=true;//是0为真
		for(int i=0;i<len;i++) {
			if(is0&&number[i]!=0) {//非0,设置is0=false
				is0=false;
			}
			if(!is0) {
				System.out.println(number[i]);
			}
		}
		System.out.println("\n");//换行
	}

	private boolean Increment(int[] number) {
		// TODO Auto-generated method stub
		boolean isOverflow=false;//最后一位标志
		int nTakeOver=0;//进位+1
		int len=number.length;
		for(int i=len-1;i>=0;i--) {
			int nSum=number[i]+nTakeOver;
			if(i==len-1)//大数最后一位+1
				nSum++;
			if(nSum>=10) {
				if(i==0) {//如果是第一位有进位则溢出
					isOverflow=true;
				}
				else {//不是,则处理进位,进位标志=1
					nSum-=10;
					nTakeOver=1;
					number[i]+=nSum;
				}
			}else {//没进位
				number[i]+=nSum;
				break;
			}
		}
		return isOverflow;
	}
}

 

解法二Java实现:

public class Print1ToMax{
	
	void Print1ToMaxDigits(int n) {
		if(n<=0)
			return;
		int[] number= new int[n];
		for(int i=0;i<number.length;i++) {//初始化数组
			number[i]=0;
		}
		for(int i=0;i<10;i++) {
			number[0]=i;
			Print1ToMaxRecursively(number,n,0);//从第一位为0开始
		}
	}

	private void Print1ToMaxRecursively(int[] number, int length, int index) {
		// TODO Auto-generated method stub
		if(index==length-1) {
			PrintNumber(number);
		}
		for(int i=0;i<10;i++) {
			number[index+1]=i;
			Print1ToMaxRecursively(number,length,index+1);//开始递归
		}
	}

	private void PrintNumber(int[] number) {
		// TODO Auto-generated method stub
		int len=number.length;
		boolean is0=true;//是0为真
		for(int i=0;i<len;i++) {
			if(is0&&number[i]!=0) {//非0,设置is0=false
				is0=false;
			}
			if(!is0) {
				System.out.println(number[i]);
			}
		}
		System.out.println("\n");//换行
	}
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值