题目:
输入一个数字n,按顺序打印出从1最大的n位十进制数。比方输入3,则打印出1、2、3最大的三位数即999
这道题的主要陷阱就在大数的处理,仅仅要将这个考虑进去,用字符串来表示。就好说了。
那差点儿相同代码是这样子的:
public void print1(int n) {
if (n < 0) {
throw new RuntimeException();
}
char[] number = new char[n];
// 初始化全部的数都为'0'
initNumber(number);
// 假设没有达到'99..',而且递增
while (increaseNumber(number)) {
// 打印
printNumber(number);
}
}
1.怎么初始化呢?
这个简单:
private void initNumber(char[] number) {
for (int i = 0; i < number.length; i++) {
number[i] = '0';
}
}2.怎么打印?
到时候肯定有非常多00011这样0开头的数字
假设0开头就不打印0。到了不是0开头的,就打印后面的
private void printNumber(char[] number) {
boolean flag = false;
for (int i = 0; i < number.length; i++) {
if (number[i] != '0') {
flag = true;
}
if (number[i] != '0' || flag) {
System.out.print(number[i]);
}
}
System.out.println();
}3.怎么递增,而且当增到某个999的时候返回false,事实上时候返回true?
3.1先是怎样递增:
那就模拟数字的递增:给最后位上加一。假设大于9了,就再往上一位加1,一直往上。
3.2怎样返回true。
false
接着递增的说,比方一个长度n=3的数,最后一位加1,大于9了前一位再加一。
也就仅仅有当999加1的时候,遍历从i=0到i<3最后结果还是大于9的,所以就能够依据这个来确定返回值。
private boolean increaseNumber(char[] number) {
for (int i = number.length - 1; i >= 0; i--) {
number[i] = (char) (number[i] + 1);
if (number[i] > '9') {
number[i] = (char) (number[i] - 10);
} else {
return true;
}
}
return false;
}