完全遍歷法:
這種演算法比較基本,對於每個數n,將n依次從2除到n,然後對餘數進行比較,如果餘數是0,則除得盡,如果不是0則除不盡,按照質數的定義,只有1和他本身能成為因數也就是除得盡,所以只有除得盡的數不大於兩個時,才能是質數。
這種演算法的好處是符合大多數人的第一反應,和定義契合得比較好,也比較省空間,但問題是假如我這裡n輸入了1000000+時,這個運算時間是非常長的,其演算法複雜度高達1*10^12,小資料可以用遇到大資料就很難實現高效了。
開根號遍歷法
仔細分析演算法我們會發現,其實在做除法運算時不需要除每一個數,只要除到根號n即可。這是因為當除數大於根號n時,其結果肯定是小於根號n的(可以用反證法證明),假如此時能除得盡,那麼該種可能早就在小於根號n的遍歷中被排除掉了,就沒有意義了。這樣就減小了一部分演算法複雜度。
篩選法
篩選法的核心是犧牲記憶體換速度,因為其不透過遍歷來表達一列數而是直接透過陣列來表達。用靜態的bool量去變現數的狀態。
其核心流程為:
定義一個bool陣列,其下標為我們要判斷的數,其值為true。表示初始階段所有數都假定是素數。
開始對這個陣列進行篩選(及把值改為false),實現把因數含有2的所有數篩掉,把因數含有3的數篩掉,把因數含有5的數篩掉…一直篩選到只剩下素數為止。
這種方法運算效率非常高,特別是在十萬級以上的數中,其犧牲掉的記憶體不多,但對速度的提升確實是非常顯著的。
完全遍歷法:
這種演算法比較基本,對於每個數n,將n依次從2除到n,然後對餘數進行比較,如果餘數是0,則除得盡,如果不是0則除不盡,按照質數的定義,只有1和他本身能成為因數也就是除得盡,所以只有除得盡的數不大於兩個時,才能是質數。
這種演算法的好處是符合大多數人的第一反應,和定義契合得比較好,也比較省空間,但問題是假如我這裡n輸入了1000000+時,這個運算時間是非常長的,其演算法複雜度高達1*10^12,小資料可以用遇到大資料就很難實現高效了。
開根號遍歷法
仔細分析演算法我們會發現,其實在做除法運算時不需要除每一個數,只要除到根號n即可。這是因為當除數大於根號n時,其結果肯定是小於根號n的(可以用反證法證明),假如此時能除得盡,那麼該種可能早就在小於根號n的遍歷中被排除掉了,就沒有意義了。這樣就減小了一部分演算法複雜度。
篩選法
篩選法的核心是犧牲記憶體換速度,因為其不透過遍歷來表達一列數而是直接透過陣列來表達。用靜態的bool量去變現數的狀態。
其核心流程為:
定義一個bool陣列,其下標為我們要判斷的數,其值為true。表示初始階段所有數都假定是素數。
開始對這個陣列進行篩選(及把值改為false),實現把因數含有2的所有數篩掉,把因數含有3的數篩掉,把因數含有5的數篩掉…一直篩選到只剩下素數為止。
這種方法運算效率非常高,特別是在十萬級以上的數中,其犧牲掉的記憶體不多,但對速度的提升確實是非常顯著的。