劍指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,再判斷打印的過程。