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