題目:輸入數字n,按順序打印出從1到最大的n位十進制數。
分析:將n位數看做排列組合問題,有3個位置,每個位上從0到9中選一個數字放進去,求所有的排列情況。
三個位置是依次放進去數字的,這可以用遞歸。
每個位置上0到9的十種情況可以用for循環來遍歷。
另外,記得函數最開始進入時要檢查邊界條件。
public class Print1ToMaxOfNDigits {
/**打印從1到最大的N位十進制數
* @param n 位數
*/
public static void print1ToMaxOfNDigits(int n){
//先檢查邊界條件
if(n<=0)
return;
char[] result=new char[n];
printRecursively(result,0);
}
/** 將n位數看做排列組合問題,每個位上從0到9中選一個數字,這樣n位數可以在遞歸中形成。
* @param result 存儲n位數,每個元素是一位
* @param index 第index位從0到9中取一個數字。第index位取完數字後,index加1,遞歸,讓下一位選數字。直到i等於result的長度爲止,
* 這時n位數就形成了,打印它,回退一步改變最後位置的數字。這樣遞歸下去直到所有數字都打印完畢
*/
private static void printRecursively(char[] result, int index) {
if (index==result.length) {
printNumber(result);
return;
}
for(int i=0;i<10;i++){
result[index]=(char) (i+'0');
printRecursively(result, index+1);
}
}
/** 高位是0的話不打印,直到遇到不是0的數字爲止,截取這一位直到結束的字符串,打印之。
* @param result
*/
private static void printNumber(char[] result) {
// TODO Auto-generated method stub
String s=String.valueOf(result);
for (int i = 0; i < result.length; i++) {
if (result[i]!='0') {
System.out.println(s.substring(i));
return;
}
}
}
public static void main(String[] args){
print1ToMaxOfNDigits(2);
}
}