2016-07-13
Q12:打印1到最大的n位数
public class Q12 {
/**
* 题目:打印1到最大的n位数
* 题目说明:输入数字n,按顺序打印出从1到最大的n位十进制数。比如输入3,则打印出1、2、3一直到最大的3位数即999.
*/
public static void main(String[] args) {
// TODOAuto-generated method stub
Q12 test = new Q12();
//test.Print1ToMaxOfNDigits_1(2);
test.Print1ToMaxOfNDigits_2(4);
}
//最基本的解法,存在越界溢出现象,不稳定。
public void Print1ToMaxOfNDigits_1(int n){
int number = 1;
int i = 0;
//用来控制第n+1位的最小数(例如,输入n=2,则number为100)
while(i<n){
number *= 10;
i++;
}
for(i=0;i<number;i++){
System.out.println(i);
}
}
//把问题转换成数字排列的问题,利用递归实现。
//参数n表示的是一共有多少位
public void Print1ToMaxOfNDigits_2(int n){
//输入n 则定义一个一维n个元素的数组
int[] array = new int[n];
if(n<0)
return;
PrintArray(array,0);//此处为0时,是从1打印到n位最大数,如果是1则打印n-1位最大数,如果是2则打印n-2为最大数。
//排序从第0位开始
}
private void PrintArray(int[] array, int n){
//每一位上的数字都是从0-9的一个全排列
for(int i=0; i<10; i++){
if(n!=array.length){
array[n]=i;
PrintArray(array, n+1);
}else {
boolean isFirstNo0=false;//布尔变量控制第一个非0字符之前的0不打印
for(int j=0; j<array.length; j++){
if(array[j]!=0){
System.out.print(array[j]);
if(!isFirstNo0)
isFirstNo0=true;
}else {
if(isFirstNo0)
System.out.println(array[j]);
}
}
System.out.println();
return;
}
}
}
}