劍指offer編程題Java實現——面試題12打印1到最大的n位數。本站提示廣大學習愛好者:(劍指offer編程題Java實現——面試題12打印1到最大的n位數)文章只能為提供參考,不一定能成為您想要的結果。以下是劍指offer編程題Java實現——面試題12打印1到最大的n位數正文
題目:打印1到最大的n位數
輸入數字n,按順序打印輸出從1到最大的n位十進制數,比如輸入3,打印從1到999.
這道題考察的地方是如何表示大數問題。由於n是任意大的數組,如果n太大的話n位數就超過了long型能夠表示的范圍,在面試題11求數值的整數次方的時候題目中已經明確的提示了不考慮大數問題,在這道題中,用字符串或者數組表示大數是一種很簡單有效的方法。用字符串表示大數也適用於大數加法、大數減法和大數的乘法問題。
下面代碼是使用數組方式實現大數的產生和打印,在這道題中要特殊考慮的地方是如果實現整數+1,以及低位+1產生的進位問題的處理,還有要如何判斷當前數字是否是最大的n位數。
1 package Solution; 2 3 /** 4 * 劍指offer面試題12:打印1到最大n位數 5 * 題目:輸入數字n,按順序打印從1到最大的n位十進制數。 6 * 比如:輸入3,則打印1,2,3一直到999 7 * 解法一:使用數組表示大數 8 * @author GL 9 * 10 */ 11 public class No12PrintOneToMaxNthDigits { 12 13 //使用數組實現對數進行+1操作 14 public static boolean increment(int[] number){ 15 if(number.length<1) 16 throw new RuntimeException("invalid lenth of array"); 17 //最高位產生進位標志,則數組中的數為最大的n位整數 18 boolean isOverFlow=false; 19 //進位位 20 int carry=0; 21 //沒有產生進位的+1,循環只運行1次,產生一個進位,循環多運行一次 22 for(int i=number.length-1;i>=0;i--){ 23 int sum=number[i]+carry; 24 if(i==number.length-1) 25 sum++;//最低位+1 26 if(sum>=10){ 27 //最高位產生進位 28 if(i==0) 29 isOverFlow=true; 30 //普通位產生進位 31 else{ 32 carry=1; 33 number[i]=0; 34 sum=0; 35 } 36 }else{ 37 //普通位+1的結果保存到數組中,+1後程序退出循環 38 number[i]=sum; 39 break; 40 } 41 } 42 return isOverFlow; 43 } 44 //打印數組中表示的數,如果數組中表示的數字位數小於n,則不打印前面的0 45 public static void print(int[] number){ 46 boolean isBeginning=true; 47 for(int i=0;i<number.length;i++){ 48 if(isBeginning&&number[i]!=0) 49 isBeginning=false; 50 if(!isBeginning) 51 System.out.print(number[i]); 52 } 53 } 54 public static void main(String[] args) { 55 int[] number=new int[3]; 56 while(!increment(number)){ 57 print(number); 58 System.out.println(); 59 } 60 } 61 }數組實現大位數的表示
在實現+1的方法中,使用一個全局變量來表示是否是最大的n位數,也就是當數組的最低位array[0]產生進位的時候就已經達到了n位最大數。另外在實現+1操作時候,如果低位產生進位要將進位位加到高位上。
打印數字采用的是每生成一個數字,判斷此數字是否是最大的n位數,如果不是則打印,然後數字+1,再判斷打印的過程。