题目:输入数字n,按顺序打印从1、2、3….到最的n位数的十进制数。如输入3,打印1、2、3….999.
注意问题:
1、n<=0
2、大数问题,n位数的最大值,可能超过long范围,发生越界,解决办法是用字符串或者数组存放数。
解决办法一:
//打印1、2、3...最大的n位数
static void print1ToMaxOfDigits(int n){
if(n<=0) //非法输入
return ;
String MaxDigits = null;
StringBuffer sb = new StringBuffer();
String digits = null;
for(int i=0;i<n;i++)
//最大的n位数
sb.append(9);
MaxDigits = sb.toString();
int number = 1;
int tab = 0;
//循环条件不等于最大n位数
while(!MaxDigits.equals(digits)) {
//算法的缺点是,这里会产生大量string对象,占用空间
digits = number++ + "";
System.out.print(digits+" ");
tab++;
if(tab == 20) {
System.out.println();
tab = 0;
}
}
}
解决办法二:
用字符数组来存放数字,数组长度为n,初始化都为零,从1开始,如果在数字前面都补零的话,就会发现其实n位的所有十进制数都是0~9的全排列;也即是说我们把数字的每一位0~9排序一遍,就得到了所有十进制数,只是在打印的时候,不打印0.
全排列很容易用递归实现,数字的每一位都可能是0~9中的一个数,然后设置下一位,递归结束条件是我们已经设置了数字的最后一位。
代码:
static void print1ToMaxOfDigitsRec(int n) {
if(n<=0)
return;
char[] number = new char[n];
for(int i=0;i<10;i++) {
number[0] = (char) (i + '0');
print1ToMaxOfDigitsRecursively(number,n,0);
}
}
static void print1ToMaxOfDigitsRecursively(char[] number, int len,
int index) {
if(index == len-1){
printNum(number);
return;
}
for(int i=0;i<10;i++) {
number[index+1] = (char) (i + '0');
print1ToMaxOfDigitsRecursively(number, len, index+1);
}
}
private static void printNum(char[] number) {
boolean isBegining = true;
int len = number.length;
for(int i=0;i<len;i++) {
if(isBegining && number[i]!= '0') {
isBegining = false;
}
if(!isBegining){
System.out.print(number[i]);
}
}
System.out.println();
}