1 題目描述
題目:輸入數字 n, 按順序打印從 1 到 最大位 n 位十進制數。
比如輸入 3 打印 1,2,3 一直打印到 999
2 解法描述
1 乍看之下的解法
public static void print12Max(int n){
int result=1;
int i;
if(n<=0) return;
for(i=0;i<n;i++){
result*=10;
}
for(i=1;i<result;i++){
System.out.println(i);
}
}
存在問題;當 n 值很大時會導致越界出現錯誤情況,沒有考慮大數情況
2 在字符數組上模擬數字加法,解決大數溢出問題
public static void print12Max_1(int n){
//用長度爲 n 的字符數組表示數字
char[] number=new char[n];
int i;
if(n<=0) return;
for(i=0;i<n;i++){
number[i]='0';
}
while(increment(number)){
printResult(number);
}
}
private static boolean increment(char[] number){
boolean overflow=true;
int takeover=0;
int i;
int len=number.length-1;
for(i=len;i>=0;i--){
int sum=number[i]-'0'+takeover;
if(i==len){
sum++;
}
if(sum>=10){
if(i==0){
overflow=false;
break;
}else{
number[i]='0';
takeover=1;
}
}else{
number[i]=(char) (sum+'0');
break;
}
}
return overflow;
}
private static void printResult(char[] number){
boolean flag=true;
for(int i=0;i<number.length;i++){
if(number[i]=='0'&&flag){
}else{
flag=false;
System.out.print(number[i]);
}
}
System.out.println();
}
上述代碼使用字符數組模擬整數的加法,代碼有點長,接下來換一種思路來考慮這個問題,n 位所有的十進制數其實就是 n 個從 0 到 9 的全排列,也就誰說,我們把數字的每一位從 0 到 9 排列一遍,就得到了所有的十進制數,只是打印的時候,數字排在前面的 0 不打印出來。
比如 n=10 時
依次打印
0000000001
……
0000000009
0000000010
……
9999999999
public static void print12Max_2(int n){
if(n<=0) return;
char[] number=new char[n];
for(int i=0;i<n;i++){
number[i]='0';
}
for(int i=0;i<10;i++){
number[0]=(char) (i+'0');
showRecursive(number,0);
}
}
private static void showRecursive(char[] number,int index){
if(index==number.length-1){
printResult(number);
return;
}
for(int i=0;i<10;i++){
number[1+index]=(char) (i+'0');
showRecursive(number,index+1);
}
}