练习题---输出0到n位最大值之间的所有数---Java实现

输入正整数n,要求输出0到n位最大值间的所有数

例如输入2,则输出为0-99间的所有数

输入3,输出0-999间的所有数

注意:可以先计算处Math.pow(10,n)-1,然后for循环进行输出。但是当n很大的时候,这种方法就不适用了。

考虑用全排列的情况,即每一位都是0-9之间取值。

使用迭代法,先对最高位取值0-9,对于每一种取值:固定最高位,对次高位进行取值...

/**
 * 输入正整数n
 * 输出从0到长度为n的最大值间的所有值
 * 例如:输入为2
 * 输出为:0,1,2,...,99
 * established time: 2019/10/22
 */
public class NLenNum {
	public static void main(String[] args) {
		int n = 3;
		new NLenNum().nNum(n);
	}
	
	private void nNum(int n) {
		if(n<1)
			return;
		char[] nums = new char[n];
		//固定住最高位,最高位为0-9
		for(int i = 0; i<10; i++) {
			nums[0] = (char) ('0'+i);
			produceNum(nums, n, 0);
		}
	}
	
	/**
	 * 产生数字
	 * @param nums 包含len个单元,表示一个长度为len的数字,例如长度为3的009,100
	 * @param len 数字的数组长度
	 * @param index 固定最高的位数,例如index=0,固定最高位,index=1,固定最高的前两位
	 */
	private void produceNum(char[] nums, int len, int index) {
		if(index == len-1) {//最后一位也固定了,那么可以输出该数字了
			printNum(nums, len);
			return;
		}
		for(int i = 0; i<10; i++) {
			nums[index+1] = (char) ('0'+i);
			produceNum(nums, len, index+1);
		}
		
	}
		
	/**
	 * 输出nums数组代表的数字,数组长度为len
	 * @param nums
	 * @param len
	 */
	private void printNum(char[] nums, int len) {
		int not0Index = -1;
		for(int i = 0; i<len; i++) {//记录第一个不为'0'的下标
			if(nums[i]!='0') {
				not0Index = i;
				break;
			}
		}
		if(not0Index==-1) {//数字为0,直接输出0即可
			System.out.println(0);
		}else {
			for(int i = not0Index; i<len; i++) {
				System.out.print(nums[i]);
			}
			System.out.println();
		}
	}
}

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值