c語言中素數的判斷方法,C語言中素數的判斷方法

2022-02-21 07:49:25 字數 5367 閱讀 1993

1樓:五四公社

介紹三種使用c語言來判斷素數的方法,以及用做素數表來判斷找素數的方法。

2樓:匿名使用者

求素數的方法很多,其中最簡單的一種就是除以它之前的所有數(從2開始),如果都不能整除,

它就是一個素數。這個是根據素數的定義求解的,只能被1和它本身整除。

但顯然這樣的效率是不高的,如果要求1-100內的素數,對每一個數除以之前所有的數,有很多優化的餘地。

比如除以素數就可以了,沒必要去除以合數,於是加一個表,把之前的結果儲存下來,利用空間換取時間。

對於素數的判定,其實只需要判定是否能被 sqrt(n) 以內的素數整除。

感性上講,對於n,要麼是質數,只能被1和自己整除,要麼能分解質因數,至少有兩個素數因子。 n=p..q

因為不可能p和q都大於sqrt(n)(否則乘積就大於n了),所以只需要判斷那個小的素數能不能被n整除就可以了。

這樣,把求素數的演算法又提高了一步,不過計算中大量的用到除法,除法效率一般比較低。

有一種篩法求素數的演算法,把1-n排成一排,從2開始,2的倍數肯定不是素數,去除,剩下的數中下一個是3.

再把3的倍數去除,再下一個是5(4已經去除了),以此類推,最後剩下的數必然是素數,因為

它沒有被篩,不是任何一個數的倍數(除了1和自己)。這樣只需要很多次加法就可以了。

例如一個求 3000000 以內的素數的程式:#include

#include

using namespace std;

const int max=3000000;

char table[max];

void cal_prime()}}

}int main()

return 0;

}複製**這算是基本的篩法了,它更是以空間換取時間,因為記憶體中存的表不只是素數,還有合數的空間,合數比素數多得多。。。

它也有很多優化的餘地,比如6,在2的時候篩掉一次。在3的時候又篩掉一次。篩選的時候,一個數之所以能被篩去兩次,

它至少是兩個質數的倍數,每個質因數篩選一次。通過一定程度上減少重複,可以提升演算法的效率。

對於這種演算法的改進,有一種更直接的演算法,線性篩選,就是對一個合數,就進行一次篩選,極大程度的減少重複計算。

同樣條件**如下:#include

#include

using namespace std;

const int max=3000000;

char table[max];

int prime[max];

int num = 0;

void cal_prime()}}

int main()

return 0;

}複製**這個演算法又多了兩倍的空間儲存質數,還好這樣空間複雜度也是o(n)。

演算法中關鍵點是

if ( i % prime[j] == 0 ) break;

沒有這句這個跟篩法就差不多了,主要是防止重複篩除。

這個應該算是求素數最快的確定性演算法了,不過感覺用途也不是非常大,除了學習跟玩之外。。。

一般素數的應用在加密領域,利用一個數分解成兩個大素數的積非常難的性質,

數論上大數非常大,陣列是不可能放下1-n個數的(定址都不行了)。這點上這個演算法還沒有

之前直接除的演算法實用,最起碼一直等還是能出來結果的。。。

不過在應用的時候可以利用費馬小定理試探素數,雖然有一定出錯的概率,但是概率非常小,

實際中是能夠容忍的。

費馬小定理雖然證明是錯的,但是總還有不少概率是對的。。。

簡單說演算法是 判斷 2^(n-1) % n == 1 是否成立,成立則基本可認為是素數。(要是整數只能算32以內的素數了,

所以先得有個大整數運算的類,沒有寫過高效的大整數實現,演算法也停留在理論 ⊙﹏⊙b汗。。。)

(費馬定理是 a^(n-1) % n == 1 對所有 a < n 的正整數成立。這個小定理算是逆命題特化,不過

是錯的。。。)

3樓:魏子棟

需要自己根據素數的數學定義,自行書寫素數判斷函式並呼叫。

1、素數的判斷。

根據素數定義,除了1和本身不存在其它約數的正整數為素數。

所以在c語言中判斷n是否為素數可以從2開始到到n-1逐一嘗試,如果可以整除說明不是素數。

更進一步,可以從2判斷到n/2或者n的算術平方根,如果不存在約數,那麼即為素數。

除此以外,判斷素數的演算法還有素數篩等。

2、函式編寫:

以遍歷判斷約數的方法為例,函式可以編寫如下:

int isprime(int n)//判斷n是否為素數,如果是則返回1,否則返回0.

3、以輸入一個整數值,判斷是否為素數,並輸出結果,完整程式如下:

#include

#include

int isprime(int n)//判斷n是否為素數,如果是則返回1,否則返回0.

int main()

注意,用到了平方根函式sqrt,所以需要包含標頭檔案math.h

4樓:匿名使用者

從大於m的數迴圈,讓每個數x從2到sqrt(x)(x的開方取整)看是否存在約數,如果有則不為素,否則為素。讓一個清零的計數器sum每找到一個素就++,直到sum==k時跳出

5樓:化涵桃

不加大括號,for迴圈只執行printf();語句,不會執行break;這一行,迴圈語句的範圍是看括號的範圍的,沒有括號就看它下面出現的第一個分號(;)

6樓:匿名使用者

你可以通過可執行檔案放在專門的c語言虛擬機器內執行,檢視結果的準確性,你可以呼叫谷歌伺服器電腦系統的api,然後帶入實參,除錯一下程式看看能不能判定它的素數,另外別忘了植入標頭檔案,畫流程圖

7樓:某某知識教授

c語言中判斷n是否為素數可以從2開始到到n-1逐一嘗試,如果可以整除說明不是素數。

根據素數定義,除了1和本身不存在其它約數的正整數為素數。

更進一步,可以從2判斷到n/2或者n的算術平方根,如果不存在約數,那麼即為素數。

8樓:匿名使用者

判斷是不是素數,素數就是隻能被1和本身整除的自然數。void main()

9樓:匿名使用者

先來一種比較快速的素數篩選法,這是一種非常高效的篩法,原理的話,你得看下數論方面的書籍#include

#include

#define maxn 100int flag[maxn+1];int main()

for(i=2;i<=maxn;i++)

if(!flag[i])

printf("%d ",i);

printf("\n");

return 0;

}下面的用的是最普通的演算法#include#include

#define maxn 100int main()if(j==i)

printf("%d ",i);}}

printf("\n");

return 0;}

10樓:陳士晟

這是函式的做法

#include

void main()

int sushu(int a)}}

用c語言如何判斷素數?

11樓:喜歡種蘑菇

素數又稱質數,所謂素數是指除了 1 和它本身以外,不能被任何整數整除的數,例如17就是素數,因為它不能被 2~16 的任一整數整除。

思路1、判斷一個整數m是否是素數,只需把 m 被 2 ~ m-1 之間的每一個整數去除,如果都不能被整除,那麼 m 就是一個素數。

思路2、判斷方法還可以簡化。

m 不必被2~m-1之間的每一個整數去除,只需被2~√m之間的每一個整數去除就可以了。如果 m 不能被2~√m 間任一整數整除,m必定是素數。例如判別17是是否為素數,只需使17被2~4之間的每一個整數去除,由於都不能整除,可以判定17是素數。

原因:因為如果m能被2~m-1之間任一整數整除,其二個因子必定有一個小於或等於√m,另一個大於或等於√m。

例如16能被2、4、8整除,16=2*8,2小於 4,8大於4,16=4*4,4=√16,因此只需判定在2~4之間有無因子即可。

兩種思路的**請看解析。

拓展資料:

素數(prime number)又稱質數,有無限個。素數定義為在大於1的自然數中,除了1和它本身以外不再有其他因數。

c語言是一門程序導向、抽象化的通用程式設計語言,廣泛應用於底層開發。c語言能以簡易的方式編譯、處理低階儲存器。c語言是僅產生少量的機器語言以及不需要任何執行環境支援便能執行的高效率程式設計語言。

12樓:龍鬆漫談

首先要知道素數是不等於1,它的因子只有1和它本身。判斷一個數是否為素數,可以用大於1小於給定數的所有數去除給定數,如果有任何一個能夠除盡,就表示是合數,反之是素數。下面是具體如何用c語言判斷素數的過程:

1、開啟visual c++ 6.0,點選【檔案】-【新建】-【檔案】,然後選擇【c++ source file】;

2、輸入預處理命令和主函式:

#include/*函式頭:輸入輸出標頭檔案*/

void main()             /*空型別:主函式*/

3、定義變數並輸入一個數字:

int m,i;                    /*定義變數的資料型別為整型*/

printf("輸入一個數:");     /*輸出文字提示*/

輸入一個數字*/

4、用for函式和if函式判斷是否是素數:

for(i=2;i<=m;i++)           /*用for函式重複下面步驟*/

if(m%i==0)              /*判斷輸入的數是否能被除1和本身以外的數整除*/

break;

if(i>m)                 /*判斷i是否大於m*/

printf("%d 是素數\n",m);       /*輸出是素數*/

else

printf("%d 不是素數\n",m);     /*輸出不是素數*/

5、最後我們輸入一個數來驗證這條程式是否正確。

13樓:五四公社

介紹三種使用c語言來判斷素數的方法,以及用做素數表來判斷找素數的方法。

14樓:匿名使用者

#include

#include

using namespace std;

int main()

for(int i=2;i

return 0;}

C語言中的N次方的表示方法,在C語言中怎樣表示一個數的n次方

include pow a,n 次函式返回a的n次方 上面已經回答了 不過好像呼叫函式是要求是形參是雙精度的。在c語言中怎樣表示一個數的 n 次方 c語言中計算一個數的n次方可以用庫函式pow來實現。函式原型 double pow double x,double y 舉例如下 double a po...

c語言中while的用法C語言中while的用法

c語言中while的用法解析如下 一 1表示true,在bool型別取值false和true,0為false,非0為true 例如 1和2都是true 程式中,這裡1就表示永真,直到迴圈體內遇到break。二 while用法演示解析 1 含義 while 迴圈會在指定條件為真時迴圈執行 塊。2 語法...

c語言中while的用法,C語言中while的用法

當n 1時執行while迴圈結構裡的語句,當n不等於1時,則跳過該迴圈執行迴圈體外的語句。while 迴圈的格式 while 表示式 while 迴圈的執行順序 當表示式為真,則執行下面的語句,語句執行完之後再判斷表示式是否為真,如果為真,再次執行下面的語句,然後再判斷表示式是否為真 就這樣一直迴圈...