NO13: 输入数字n,按顺序打印出从1最大的n位十进制数。比如输入3,则打印出1、2、3一直到最大的3位数即999
一般考虑用int/ long数据类型。但是在大数问题中会有溢出。使用字符串和数组是处理大数问题的好方法。
public class NO13 {
/**
* 输入数字n,按顺序打印出从1最大的n位十进制数。
* 比如输入3,则打印出1、2、3一直到最大的3位数即999
*/
public static void main(String[] args) {
NO13A no13A = new NO13A();
int n = 2;
no13A.print1ToMaxOfNDigits(n);
}
}
class NO13A{
public void print1ToMaxOfNDigits(int n) {
StringBuffer stringBuffer = new StringBuffer(n + 1);
for (int i = 0; i < n; i++) {
stringBuffer.append('0');
}
while (!increment(stringBuffer)){
printNumber(stringBuffer);
}
}
private boolean increment(StringBuffer stringBuffer){
boolean isOverFlow = false;
int nLength = stringBuffer.length();
int nTakeOver = 0;
for (int i = nLength - 1; i >= 0 ; i--) {
int nSum = stringBuffer.charAt(i) - '0' + nTakeOver;
if (i == nLength - 1){
nSum++;
}
if (nSum >= 10){
if (i == 0){
return isOverFlow = true;
}else{nSum -= 10;
nTakeOver = 1;
stringBuffer.setCharAt(i, (char) (nSum + '0'));
}
}else{
stringBuffer.setCharAt(i, (char) (nSum + '0'));
break;
}
}
return isOverFlow;
}
private void printNumber(StringBuffer stringBuffer){
boolean isBeginWith0 = true;
for (int i = 0; i < stringBuffer.length(); i++) {
if (isBeginWith0 && stringBuffer.charAt(i) != '0'){
isBeginWith0 = false;
}
if (!isBeginWith0){
System.out.print(stringBuffer.charAt(i));
}
}
System.out.println();
}
}