题目:
输入数字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();
}