判斷是否為素數
對於乙個任意乙個正整數,如果它只能被自身或1整除,稱其為素數,否則為合數。1比較特殊,既不是質數也不是合數。
基於素數的定義,很快就可以直觀的想到**,對於任意乙個正整數,只需要在(1,n)也就是[2,n-1]之間進行遍歷,如果n可以被區間中的任何乙個數字整除,它就不是質數。否則,如果對整個區間遍歷完畢,還未找到乙個數字可以整除n,那麼這個數字就是質數。
public test
}return
true;}}
演算法時間複雜度分析:
對於上邊窮舉遍歷暴力的方法,判斷乙個正整數是否為素數。所需的時間複雜度是o(n),然而在實際應用中,判斷某乙個數字是否為為素數只是整個程式當中的一小部分,這樣的時間複雜度相對而言還是比較高的。
下面將一種時間複雜度為o(n^(1/2))時間複雜的判斷素數的演算法。
數學背景:對於任意乙個正整數n,可以將其分解為兩個因數。特殊情況下n^(1/2)相等,即n=n^(1/2)*n^(1/2)。此外若存在兩個因數,則其中乙個必然大於n^(1/2),而另外乙個必然小於n^(1/2)。因此,只需要在區間[2,n^(1/2)]區間遍歷即可,若在此區間存在乙個正整數使得n被整除,則其為合數(此時這個因數小於n^(1/2),而另外乙個因數必然大於n^(1/2)),否則其為質數。進過這樣的 處理可以顯著的降低判斷是否為質數演算法的時間複雜度,達到o(n^(1/2))。
public test
}return
true;}}
素數篩選法:
從小到大遍歷每乙個數字,將其倍數篩去,剩下的即為素數。
class test
public
void
prime(int n)}}
} public
void
show(int n)
}}public
class main
}
輸出100範圍內的素數:
素數篩選法
篩選素數法 搞acm的都知道,素數是數論中必不可少的知識,也是必須要掌握的,關於素數的篩選有好幾種方法,下面一一道來,寫的不好還請提出。第一種是最常規的做法 int main if j sqrt i cout 這種方法肯定是比第一種快的,至於快多少大家可以比較一下,注意到裡面的for迴圈是到sqrt...
素數篩選法
素數篩選法差不多是打標,用前面確定的質數篩選掉後面的合數,然後遍歷下來所有的合數都被篩選掉了,剩下的都是素數。int vis maxn for int i 2 i n i for int j i 2 j n j i vis j 1 這是沒有優化的素數篩選法,也已經很快了,時間複雜度是n log n。...
素數篩選法
素數,是指因子只包含1和其本身的數,那麼,我們怎麼判斷素數呢?以下 均基於打表 1 1e6 的基礎上完成 素數的定義就是乙個數的因子只包含1和其本身,那麼我們直接就按照定義寫 include include define maxn 1000000 10 int pri maxn int isprim...