本题没有规定n的范围。当输入的n很大的时候,我们求最大的n位数是不是用整数(int)或者长整数(long long)都会溢出?也就是说我们需要考虑大数问题。
最长用也是最容易的方法用字符串或者数组表达最大数。接下来我们用字符串(字符数组)来解决大数问题。
在用字符串表示数字的时候,最直观的方法就是字符串里每个字符都是‘0’ - ‘9’之间的某一个字符,用来表示数字中的一位。
第一种方法:
public class Main {
public static void main(String[] args) {
printToMax(1);
}
public static void printToMax(int n) {
if(n<=0) return ;
char [] number = new char[n];
Arrays.fill(number,'0');
while(!increment(number)) {
printNumber(number);
}
}
//为字符数组每一位都+1,并且判断溢出
static boolean increment(char[] number) {
boolean isOverflow = false;
int nTakeOver = 0;
int nLength = number.length;
for(int i = nLength-1;i>=0;i--) {
int nSum = number[i] - '0'+nTakeOver;
if(i == nLength-1) nSum++;
if(nSum>=10) {
if(i == 0) {
isOverflow = true;
}else {
nSum-=10;
nTakeOver = 1;
number[i] = (char) ('0'+nSum);
}
}else {
number[i] = (char) ('0'+nSum);
break;
}
}
return isOverflow;
}
//打印输出
public static void printNumber(char []number) {
boolean isBeginning0 = true;
int nLength = number.length;
for(int i = 0;i<nLength;i++) {
if(isBeginning0&&number[i]!='0') isBeginning0 = false;
if(!isBeginning0) System.out.print(number[i]);
}
System.out.println();
}
}
第二种解法:
递归
public class Test {
public static void main(String[] args) {
printToMax(1);
}
public static void printToMax(int n) {
if(n<=0) return ;
char [] number = new char[n];
for(int i = 0;i<10;i++) {
number[0] = (char) (i+'0');
printToMax(number,n,0);
}
}
public static void printToMax(char[]number,int length,int index) {
if(index == length-1) {
printNumber(number);
return ;
}
for(int i =0;i<10;i++) {
number[index+1] = (char) (i+'0');
printToMax(number,length,index+1);
}
}
public static void printNumber(char []number) {
boolean isBeginning0 = true;
int nLength = number.length;
for(int i = 0;i<nLength;i++) {
if(isBeginning0&&number[i]!='0') isBeginning0 = false;
if(!isBeginning0) System.out.print(number[i]);
}
System.out.println();
}
}