题目:输入数字n,按顺序打印出从1到最大的n位十进制数。比如输入3,则打印出1、2、3一直到最大的3位数999。
用字符串来解决大数问题。
要记住number字符串是有保存数字的,每次只要在number[i]的基础上操作就可以了。
package offer;
import java.util.Scanner;
public class Solution17 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
Solution17 sl = new Solution17();
System.out.println("请输入n=");
int n = scanner.nextInt();
sl.print1ToMaxOfNDigits1(n);
}
public void print1ToMaxOfNDigits1(int n) {
if (n <= 0)
return;
StringBuffer number = new StringBuffer();
for (int i = 0; i < n; i++) {
number.append('0');
}
while (!Increment(number)) {
PrintNumber(number);
}
}
// 判断是否是最大数
public boolean Increment(StringBuffer number) {
boolean isOverflow = false; // 是否进位
int nTakeOver = 0;
int nLength = number.length();
for (int i = nLength - 1; i >= 0; i--) {
int nSum = number.charAt(i) - '0' + nTakeOver; // 加入number[i]='2',这里是字符'2'而非数值2,而'2'的ASCII码剪去'0'的ASCII码=数值2对应的ASCII码,这里是模拟加法的作用
if (i == nLength - 1)
nSum++;
if (nSum >= 10) {
if (i == 0) {
isOverflow = true; // 第一个字符有进位啦!
} else {
nSum -= 10;
nTakeOver = 1;
number.setCharAt(i, (char) ('0' + nSum)); //
}
} else {
number.setCharAt(i, (char) ('0' + nSum));
break;
}
}
return isOverflow;
}
// 打印出字符串
public void PrintNumber(StringBuffer number) {
boolean isBeginning = true;
for (int i = 0; i < number.length(); i++) {
if (isBeginning && number.charAt(i) != '0') {
isBeginning = false;
}
if (!isBeginning) {
System.out.print(number.charAt(i));
}
}
System.out.println();
}
}