看到这个题目,最先想到的就是直接一个for循环输出不就完了吗?
这个只是在n不大的情况下,如果n很大那么就不能实现了
关于大数问题最终将转化到字符串上面来,下面是用字符串打印1到n的整数
package 剑指Offer;
/*
* 打印1到N的数
*
* */
public class Top12 {
public static void main(String[] args) {
Print1ToMaxOfNDigits_2(20);
}
public static void Print1ToMaxOfNDigits_2(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 static boolean Increment(StringBuffer s){
boolean isOverflow = false;
int nTakeOver = 0;
int nLength = s.length();
for(int i = nLength - 1; i >= 0; i--){
int nSum = s.charAt(i) - '0' + nTakeOver;
if( i == nLength - 1){
nSum++;
}
if(nSum >= 10){
if(i == 0){
isOverflow = true;
}else{
nSum -= 10;
nTakeOver = 1;
s.setCharAt(i, (char) ('0' + nSum));
}
}else{
s.setCharAt(i, (char) ('0' + nSum));
break;
}
}
return isOverflow;
}
public static void PrintNumber(StringBuffer s){
boolean isBeginning0 = true;
for(int i = 0; i < s.length(); i++){
//遇到第一个不为‘0’的字符开始打印
if(isBeginning0 && s.charAt(i) != '0'){
isBeginning0 = false;
}
if(!isBeginning0){
System.out.print(s.charAt(i));
}
}
System.out.println();
}
}