我愛擼碼,擼碼使我感到快樂!
大家好,我是Counter,今天非常愉快,沒有前幾天的相對比較復雜的邏輯思維在里面,今天來寫寫,利用JS打印質數,基本上很多面試,會很經常的考到。
那廢話不多說,直接上代碼:
// for循環,打印10000以內的質數 for(var i = 0; i < 10000; i++) { // 如果這邊函數返回true就意味着當前的i是質數,那么將它打印出來 if (num(i)) { console.log(i); } } // 定義函數,形參a function num(a) { // 如果a<2或者a取余2等於0,那么就直接return false,因為我們知道質數的定義是,只能被1和它自己本身整除,那么能被2整除的肯定都不是質數了 if ( a < 2 || a % 2 == 0) { // 但是2是質數,那這邊做下特殊處理。如果傳進來的實參是2的話那么返回true if (a == 2) { return true; } return false; } // 這邊直接定義變量3,因為偶數全都被我們排除了 var j = 3; // while循環,如果j小於傳進來的參數的話,那么進行里面的語句 while( j < a ) { // 如果傳進來的參數取余j等於0的話,說明能被整除,那么返回false if ( a % j == 0) { return false; } // 如果取余不為0的話,那么j就再加2,如果j還是小於傳進來的參數的話,那么在進行while循環,確保每個數都能除以所有比它小的奇數。 j += 2; } // 我們知道3也是質數,那這邊3傳進來直接就返回true return true; }
那這邊除了用這種方法,其實還有種方法,那就利用函數的立即執行,也是可以的,直接上代碼:
// 函數的立即執行,打印一萬以內的所有質數 // 定義函數的立即執行方式 (function num() { // for循環直接從2開始,因為我們知道0,1不是質數,所以直接棄除 for(var i = 2; i < 10000; i++) { // 定義個標志為true var flag = true; // 再套一層循環,如果j小於i的話,j才自增1,那么意味着,當i為3的時候,才開始進入這個表達式,並且每次都是i取余小於自己的數並且大於等於2的數進行判斷 for( var j = 2; j < i; j++) { // 如果i取余j為0的話說明此時i不是質數,標志等於false if ( i % j == 0) { flag = false; } } // 等標志為true時打印出來當前的i值,意味着打印出當前的質數 if (flag) { console.log(i); } } })();
其實我感覺第二種方法非常的簡潔,至於性能的話,經過我測試,第二種函數立即執行打印1萬以內的所有質數,耗時在500毫秒左右,當然可能也取決於我電腦性能,瀏覽器性能,不過我拿兩者相對比較來說,第一種方法耗時在100~200毫秒之間。第一種方法的性能會高點,確實應該也是這樣的,因為第一種方法咱們都給它把偶數判斷都給省了,能不快嗎?!而第二種的話,要進行二重循環,又要判斷所有的,又要除以比自己小的數,不論奇數,偶數。
所以總結: 如果考慮性能的話就選第一種吧,不想考慮性能,想寫的簡單點,那就寫第二種吧,異曲同工,條條大路通羅馬,只不過誰快而已。