题目
输入数字n,按顺序打印出从1到最大的n位十进制数,比如输入3,则打印出1,2,3一直到最大的3位数即999.
分析
- 传统方式:直接求出最大的n位数,然后循环打印。
- 传统做法的问题:当位数过大的时候,long类型都不能承载(坑一)
- 修改方案:使用字符串模拟加法操作
- add操作:个位不断加一,满十进位;其他位只有当有进位时才加一 <===> number[0] = 1 + old; number[i] = nTakeover + old;
- 进位操作:每位满十进一,不进位终止add操作
- 输出操作:前置0不输出,后面诸位输出(坑二)
MyCode
private static boolean add(StringBuffer sb) {
boolean isOverflow = false;
int nTakeover = 0;
for (int i = sb.length() - 1; i >= 0; i--) {
//add
int n = sb.charAt(i) - '0';
if (i == sb.length() - 1)
++n;
else
n += nTakeover;
//deal with takeover
if (n >= 10) {
if (i == 0)
isOverflow = true;
else {
nTakeover = 1;
sb.setCharAt(i, '0');
}
} else {
sb.setCharAt(i, (char) ('0' + n));
break;
}
}
return isOverflow;
}
private static void print(StringBuffer sb) {
int i = 0;
for (i = 0; i < sb.length() && sb.charAt(i) == '0'; i++) ;
for (; i < sb.length(); i++){
System.out.print(sb.charAt(i));
}
System.out.println();
}
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
int n = input.nextInt();
if (n <= 0) {
return;
}
StringBuffer number = new StringBuffer();
for (int i = 0; i < n; i++) {
number.append('0');
}
while (!add(number)) {
print(number);
}
}
}