题目:输入数字n,按顺序打印出从1到最大的n位十进制数。比如输入3,则打印出1、2、3一直到最大的3位数即999。
说明:1.本题本质上是一个大数问题。
2.打印出习惯上的十进制数。
3.分析问题仍然是全集观念,且算法体现可读性和高效性。
public static void printToMaxDigitBitOf(int n) {
if (n <= 0) {
throw new IllegalArgumentException();
}
char[] number = initNumberStoreUpTo(n);
while (increase(number)) {
printNumber(number);
}
}
private static char[] initNumberStoreUpTo(int n) {
char[] number = new char[n];
for (int i = 0; i < n; i++) {
number[i] = '0';
}
return number;
}
private static int charToDigit(char[] number, int currentBit) {
return number[currentBit] - '0';
}
private final static char[] tenDigits = {'0', '1', '2',
'3', '4', '5',
'6', '7', '8',
'9'};
private static boolean increase(char[] number) {
int lowBit = number.length - 1;
int highBit = 0;
int carryDigit = 0;
int bitSum = 0;
boolean canIncrease = false;
for (int i = lowBit; i >= highBit; i--) {
bitSum = (i != lowBit ? (charToDigit(number, i) + carryDigit) : (charToDigit(number, i) + 1));
if (bitSum < 10) {
number[i] = tenDigits[bitSum];
canIncrease = true;
break;
}
if ((bitSum >= 10) && (i != highBit)) {
number[i] = tenDigits[bitSum - 10];// may be have a problem ?
carryDigit = 1;
}
/*if ((bitSum >= 10) && (i == highBit)) {
canIncrease = false;
}*/
}
return canIncrease;
}
public static void printNumber(char[] number) {
boolean notZeroFound = false;
for (int i = 0; i < number.length; i++) {
if (number[i] != '0') {
notZeroFound = true;
}
if (notZeroFound) {
System.out.print(number[i]);
}
}
System.out.println();
}