java常見面試題1:輸出1-100之內的所有質數


很多人筆試時都會遇到這個問題,小農也試着寫了一下(^_^ )。

概念所謂質數就是只能被1和它本身整除的數那么對於某一個數a,可以試着讓它除以a-1......2,如果有任意一次除法的余數為零,這個數a就不是質數。

 

 

方法一:

 

完全根據質數的定義,我稱這種方法叫做“笑而不語最直接法”。該方法完全可以輸出正確結果,但這肯定不是面試官想要的

 

 1 public static void test4() {
 2         
 3         System.out.println(2);
 4         System.out.println(3);
 5         System.out.println(5);
 6         System.out.println(7);
 7         for(int i=10;i<=100;i++){
 8             if(i%2!=0 && i%3!=0 && i%5!=0 && i%7!=0){
 9                 System.out.println(i);
10             }
11         } 
12     }

 

方法二:

 

思路:

1這個程序用了兩層循環。外層循環列舉從2到100之間的每一個整數(作為被除數)
然后在內層循環中用從2到它之間的數去除它,如果找到了一個能夠整除它的數,內層循環將立即跳出(此時j小於i)。 
如果一直沒有找到能夠整除它的數,則當內層循環將2到它之間的所有數都嘗試過一遍之后,內層循環也跳出(此時j等於i)。 
 
2等到內層循環跳出之后,程序接着判斷j是否大於等於i,如果是(上面第二種情況),
表明這個數是質數,於是將這個數打印出來並計算到累加和中去;如果不是(上面第一種情況),表明這個數不是質數。

 1 public static void test2() {
 2         int i, j;
 3         for (i = 2; i <= 100; i++) {
 4             for (j = 2; j < i; j++) {
 5                 if (i % j == 0)
 6                     break;
 7             }
 8             if (j >= i)
 9                 System.out.println(i);
10         }
11     }

 

 

方法三:

思路:

1外層循環作為被除數,內層循環作為除數。

2定義一個開關,標記外層循環數是否為質數。默認為 true

3、內層循環結束,如果開關還為true。即被除數為質數,打印出來

 1 public static void test3() {
 2         for (int i = 2;i<= 100;i++){//1既不是質數也不是和數,所以從2開始
 3             boolean k = true;
 4             for (int n = 2; n < i; n++) {
 5                 if (i % n == 0) {
 6                     k = false;
 7                     break;
 8                 }
 9             }    
10             if(k){
11                 System.out.print(i + " ");
12             }
13         }
14 }

升級版:
  如果能把上兩種方法寫出來,確實已經很好了。但有沒有更優的代碼去實現?

試着去想這些問題:

1、外層for循環有必要執行100次嗎?

   除了2所有的偶數都不是質數,那么能不能只遍歷奇數。

   代碼:for (int i = 3; i < 100; i+=2) //i一次循環自增2

       考慮到這個問題,for循環就少遍歷了50次。效率就提升了一倍

2、內層for循環能不能也做些優化呢?

   內層for循環作為 除數(除數從到 被除數-1),通過規律發現

   除數只需要從3 到  就行了。

 

 1 public static void test4() {
 2         boolean bool;
 3         for (int i = 3; i < 100; i+=2) {
 4             bool = true;
 5             for (int j = 3; j <= Math.sqrt(i); j++) {
 6                 if (i % j == 0) {
 7                     bool = false;
 8             break;
 9                 }
10             }
11             if (bool)
12                 System.out.print(i + " ");
13         }
14     }


用最后一種方法,是不是更會博得面試官的青睞呢

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM