输入正整数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();
}
}
}