題目:
輸入數字n,按順序打印出從1到最大的n位十進制數,比如輸入3,則打印出1、2、3一直到最大的3位數999
注意:
該題需要考慮大數問題,n的範圍沒有規定,可以很大,所以不能用int 或 long long 類型來存儲概數。
我們用數組存儲(int[] numbers = new int[number+1])
方法一:在數組上模擬數字加法代碼實現:
/**
* Created by FHY on 2019/3/21.
*/
public class Print1toNDemo {
public static void main(String[] args){
doPrintNumbers(5);
}
public static void doPrintNumbers(int number){
int[] numbers = new int[number+1]; //新建數組,默認初始化爲0
while(!increment(numbers)){
//未越界
doPrint(numbers);
}
}
private static boolean increment(int[] numbers) {
boolean ifOverFlow = false;
int nTakeOver = 0; //進位
int sum = 0;
int length = numbers.length ;
for(int i = length - 1; i >= 0; i--){
sum = numbers[i] + nTakeOver; //本位數+進位
if(i == length - 1){
sum ++;
}
if(sum >= 10){
if(i == 1){
ifOverFlow = true;
}else{
nTakeOver = 1;
sum -= 10;
numbers[i] = sum;
}
}else{
numbers[i] = sum;
break; //若沒有進位,則高位不會再有變化
}
}
return ifOverFlow;
}
private static void doPrint(int[] numbers) {
int i = 0;
while(i < numbers.length && numbers[i] == 0){
i++;
}
for(; i<numbers.length; i++){
System.out.print(numbers[i]);
}
System.out.println();
}
}
方法二:把問題轉換成數字排列的解法:
/**
* Created by FHY on 2019/3/21.
*/
public class Print1toNDemo {
public static void main(String[] args){
doPrint2(5);
}
//全排列打印
public static void doPrint2(int length){
int[] numbers = new int[length];
for(int i = 0; i < 10; i++){
numbers[0] = i;
PrintToMaxOfNDigits(numbers, length, 0);
}
}
private static void PrintToMaxOfNDigits(int[] numbers, int length, int index) {
if(index == length - 1){
doPrint(numbers);
return;
}
for(int i = 0;i < 10;i++){
numbers[index + 1] = i;
PrintToMaxOfNDigits(numbers, length, index + 1);
}
}
private static void doPrint(int[] numbers) {
int i = 0;
while( i < numbers.length && numbers[i] == 0 ){
i++;
}
for(; i<numbers.length; i++){
System.out.print(numbers[i]);
}
System.out.println();
}