利用JS打印質數


我愛擼碼,擼碼使我感到快樂!
大家好,我是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毫秒之間。第一種方法的性能會高點,確實應該也是這樣的,因為第一種方法咱們都給它把偶數判斷都給省了,能不快嗎?!而第二種的話,要進行二重循環,又要判斷所有的,又要除以比自己小的數,不論奇數,偶數。
所以總結: 如果考慮性能的話就選第一種吧,不想考慮性能,想寫的簡單點,那就寫第二種吧,異曲同工,條條大路通羅馬,只不過誰快而已。


免責聲明!

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



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