題目:輸入數字n,按順序打印從1到最大的n位十進制數。
這是一個大數問題,n較大時會產生溢出,需要用字符串來表示數字。
方法1:將n位的字符串中每一個數字初始化爲‘0’,然後每次爲字符串表示的數字加一,再打印。需要兩步,一在字符串表達的數字上模擬加法,二將字符串表達的數字打印出來。
什麼時候停止+1?當+1時最高位產生進位,表示此時已經是最大n位數。
java實現:
public void print1ToMaxOfNDigits(int n) {
if(n<0)
return;
char[] number=new char[n];
//初始化
for(int i=0;i<n;i++) {
number[i]='0';
}
while(!increment(number)) {
printNumber(number);
}
}
//判斷加一後最高位是否有進位
public boolean increment(char[] num) {
boolean isOverflow=false;
int nTakeOver=0; //進位
int length=num.length;
//從最低位開始加一,並判斷是否有進位,最高位有進位表示溢出
for(int i=length-1;i>=0;i--) {
int nSum=num[i]-'0'+nTakeOver; //nSum當前位數加上進位的和
if(i==length-1) //初始最低位加一
nSum++;
//產生進位
if(nSum>=10) {
if(i==0)//進位是最高位
isOverflow=true;
else {
nSum-=10;
nTakeOver=1;
num[i]=(char) (nSum+'0');
}
}else {
num[i]=(char) (nSum+'0');
break; //不產生進位,,沒有溢出,跳出循環
}
}
return isOverflow;
}
//打印用字符串表示的數字,把補位的0去掉,遇到第一個非0字符再打印
public void printNumber(char[] num) {
int i=0;
int size=num.length;
while(i<size&&num[i]=='0') { //找到第一個非0字符
i++;
}
if(i==size) return; //全0不打印
char[] printNum=Arrays.copyOfRange(num, i, size);
System.out.println(printNum);
}
方法2:n位所有十進制數就是n個從0到9的全排列,即數字的每一位都從0到9排列一遍。用遞歸求解,從第0位開始設置,直到設置了數字的最後一位。
public void print1ToMaxOfDigits2(int n) {
char[] number=new char[n];
Arrays.fill(number,'0');
printOrder(number,n,0);//index從0開始一直到最後一位都被賦值。結束遞歸
}
public void printOrder(char[]num,int length,int index) {
if(index==length) {
return;
}
for(int i=0;i<=9;i++) {
num[index]=(char) ('0'+i);
if(index==length-1) {
printNumber(num);
}
printOrder(num,length,index+1);
}
}