c語言,在判斷素數時為啥都會有個開根號的sqrt

2025-07-22 02:00:15 字數 5556 閱讀 6519

1樓:休真解宇文

因為乙個比根號值大的數只可能和比根號值小的數同時成為因子,所以就只需要計算到比較小的那個數就夠了。

2樓:匿名使用者

就比如要判斷17,k = sqrt(17) = ;,k的平方就是17,設17能被a整除,b =17/a;

如果a希望有所幫助。

3樓:君丶為誰酔

有個東西叫乘法交換律。左右兩邊向中間靠近就是sqrt咯。

4樓:匿名使用者

減少運算次數,提高程式效率。

c語言為什麼判斷素數用sqrt ?拜託各位大神

5樓:mio丶

你好,我們假設乙個數a; 那麼a=(a^1/2)*(a^1/2); 如果a不是素數; 那麼a有乙個版因子b a=b*c; 那麼a的因權。

子中(b或c)必定有乙個是小於等於a^1/2的; 所以判斷的時候不用判斷到1-a,只需要1-a^1/2; 明白了吧?

6樓:蔣振華悉卿

k=sqrt(n)

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

中的k有利於減少無用的迴圈次數。

因為根據數學推理可知,判斷乙個數是不內是素數不用都除於所容有小於此數的數的。只要除數小於該數的平方根就足以判斷該數是不是素數了。

這也體現c語言的程式簡潔特點。

在c語言程式設計中「求100~200間的全部的素數」為什麼會用到開平方呢

7樓:風若遠去何人留

這是乙個數學問題。

質數的定義為,除了1和本身,沒有其它因子,即沒有其它數可以被其整除。

對於任意的數n,因子肯定是比n小的數,所以如果m>n,那麼m不可能是n的因子。

於是最直觀的判斷方法就是,從1一直到n計算模除,獲取到因子總數,如果總數為2,那麼就是質數。

這樣對於任意的n,判斷質數就需要做n次模除。為了使程式優化,可以修改為,對2到n-1做模除,只要有乙個可以整除,那麼就不是整數。

對於這樣的演算法,可以再次優化。

如果n有乙個引子m, 那麼可以寫作n = m*k的形式,那麼m和k不可能同時大於n的平方根s。

這一點可以用反證法來證明。

如果m>s 且k>s

那麼m*k > s*s

於是得到n>n的結論。明顯是錯誤的。

於是m和k至少有乙個是小於等於s的。

這樣在判斷質數時,只需要從2一直到s做模除,就可以準確的判斷是否有其它因子,從而得到是否為質數的結論。

這就是為什麼在判斷質數中的程式中會用到求平方根的原因。其本質原因是為了減少模除次數,提高效率。

8樓:網友

關於開平方的問題,首先肯定如果改成for(i=2;i除此之外的情況下,這兩個數必然有乙個大於m的開平方,乙個小於m的開平方。而檢驗是否為合數只要檢驗是否能被這兩個數中任意乙個數整除就行,所以只要檢查較小的那個數,所以用i<=k,i就會取到所有較小的那個數可能的值。

關於101開始的問題請看最外層迴圈for(m=101;m<=200;m=m+2)。很明顯,程式設計師直接把偶數的情況排除了,只考慮了奇數。(因為偶數肯定不是素數嘛- -

這兩個細節都讓整個程式的迴圈次數大大減少,提高了效率。

9樓:淦海瑤

不用也可以, k=sqrt(m); for(i=2;i<=k;i++)這個可以換成。

for(i=2;i*i<=m;i++)

為什麼需要這個sqrt(m),其實是為了減少迴圈次數而已。

有三個迴圈次數,乙個是m-1,乙個是m/2(m的一半),最後乙個是sqrt(m),這三個數,都可以,但是sqrt(m)最小。

m-1不用說,肯定是可以的,素數的定義就是這樣。

m/2這個也是可以的,m/2~m之間肯定不會有他的因子,因為這個區間的數值乘以最小的係數2都比m大。

sqrt(m)這個難理解一點。因為某個數的因子肯定是圍繞sqrt(m)這個數值的在兩邊排列的。

也就是說,在1~sqrt(m)之間有個因子,那麼m除以這個因子得到的數值肯定在sqrt(m)~m之間,所以計算一次就夠了。

而且sqrt(m)這個數值比m/2要小,所以為了減少計算次數,用這個是最好的。

100肯定不是素數,這是定下的,呵呵。

c語言用sqrt求素數原理

10樓:學渣還是學霸

如果不用素數篩法的話,一般都是for求的。

設該數為n,則若該數為質數,則有a*b=n始終成立(a,b>1)。

當a<=sqrt(n)時。

n/sqrt(n)=sqrt(n)

則n/a>=sqrt(n)

n/a=b所以b>=sqrt(n)

可以發現,乙個質數的兩個因數,至少有其中乙個小於等於根號n。

可推得若乙個整數沒有至少乙個因數小於根號n,則它為素數。

綜上,sqrt(n)為判斷素數的最小臨界條件。

11樓:月光星屑

乙個合數x必有乙個不大於sqrt(x)的因子。

所以,x是乙個素數的充分必要條件是,x不被≤sqrt(x)的素數整除。

判斷是不是素數為什麼用到math.sqrt()方法

12樓:子華粉絲

假設判斷 a 是否為素數。只要 a 能整除 <=sqrt(a) 的任一整數,就可以確認它就是合數。

為什麼是 <= sqrt(a),而不是 a ÷ b = c

當 b 增大,c會減小。超過臨界之後,會出現 a ÷ c = b的情況。

假設 10 ÷ 2 = 5,此時,我們已經確認了 10 是合數。我們不需要等到 b 增大到5,10 ÷ 5 = 2,這樣反過來再除一遍就是多餘的。

當 b 增大,c會減小。超過臨界之後,會出現 a ÷ c = b的情況。那麼很顯然,a=b×c,臨界值就是b=c=sqrt(a)時。要取等號,是因為sqrt(a)有可能是整數。

13樓:每日圖鑑

可以用初中數學知識,設xy = n,在這個問題中,x >0, y > 0,沒問題吧?

1.作函式影象y = n/x,取x > 0的部分,可以想象,第一象限有個單調遞減的曲線。

我們說,上面的任何點的x和y相乘就是我們要判斷的n,到這裡應該很好理解!

2.顯然,x = y的那個點就是(根號n,根號n),也就是直線y = x與曲線的交點。只要x不等於y,肯定那個點要麼順著曲線往上跑,要麼往下跑!

3.不管怎麼跑,隨便一琢磨,它倆肯定是處處關於直線y = x對稱。比方說n = 3,我能拿出(3,2/3),那我就能拿出(2/3,3),判斷乙個點就夠用了,利用圖形對稱來想,十分清晰!

14樓:次秋梵禕

你想想吧,如果判斷100是否為素數,那就是用……去除100,只要有乙個被整除了,那100就不是素數!sqrt(100)是求100的平方根的意思,100的平方根是10,用……10去除100就可以了,用不著再用……99去除100了。為什麼呢?

因為乙個數是它的兩個平方根之積,用其中乙個平方根之內的各個數遍歷了,難道還有漏網的數未去除「這個數」?比如100吧,找個大於其平方根10的好說的數20為例,說沒有必要用20去除100了就是因為你已經用5除過了,100不是素數!a÷b=c的話,那a÷c不就等於b嘛,幹嘛非得反過來再除一次?

這樣做的目的是為了提高**時效,試想10000的平方根是100,用這方法10000是不是素數頂多做100次除法就知道了,不然就可能要做9999次,哪個時效高?多說一句,從判定「是不是素數」這一點上說,有沒有sqrt(這個數)倒確實是無意義的……

15樓:幸福永存

num = a * b

a不斷變大 b是不是不斷變小。

當a=b的時候是臨界點。

如果a> 根號num,那不就是 num = b * a 又重複執行判斷一遍了嗎?所以毫無意義。

希望能幫到你!!!

16樓:廠長王大力

假如乙個數n能寫成兩個數的乘積(非0非本身),那麼這兩個數必定乙個大於根號n,另乙個小於根號n。這個道理可以舉實際例子驗證(比如100和10),也可以觀察函式xy=n的影象驗證。利用這個原理可在程式中n較大時提效率。

求教c語言判斷素數程式演算法,為何j<=sqrt((double)i )??

17樓:萢萢

在數學上,對於素數的判斷。

可以使用從2到這個數的平方根之間的數來檢驗這樣也可以縮短判斷時間。

提高程式執行的效率。

18樓:網友

看一下素數的原理,最優的是隻要迴圈到開根號數就行了。

c語言中,用sqrt()素數的判定

19樓:匿名使用者

如果這個for迴圈中沒有滿足(m%i==0)的i值,那麼i就會一值加1直到不滿足i<=k時才會退出迴圈,什麼時候i<=k不滿足呢?當然是i>=k+1

20樓:

「i不是永遠<=k的麼」——這樣的話迴圈能退出嗎?既然迴圈能退出,就一定存在i>k的機會。k又是整數,i>k不就是i>=k+1也成立嗎?

21樓:將心獨霸

當那個for迴圈結束了,,那個i就是k+1了!!而當那個i=k+1時,說明for一直執行完都沒有break,所以m就是素數!!!

c語言中判斷101-200之間有多少個素數,並輸出所有素數。 步驟k=sqrt(m+1);為什麼不是k=sqrt(m);

22樓:

都可以取k=sqrt(m)時小於等於;

取k=sqrt(m+1)時小於等於或者小於都可以;

23樓:網友

可以是,不過迴圈結束的條件要稍微變變,(i=2;i<=k;i++)

具體的根據你的程式……

c語言程式設計,求3到n的所有素數的平方根之和,大神看看我**錯了

24樓:網友

你的第2個for迴圈的自增寫錯了。應該自增1,即j++。j初始值應該是2.

第2個for迴圈的作用是檢測i是否能被1到i的平方根之間的整數整除,如果有1個能整除,就不是素數,所以從2開始,每乙個數都需要檢測,所以j每次增加1,不是增加2.

第2個if條件寫錯了,應該是j>sqrt(i)完整fun函式**如下,你可以參考一下。

double fun(int n)

if(j>sqrt(i))

return sum;}

25樓:網友

請題主參考我寫的註釋。

#include

#include

double fun(int n)

還要判斷是不是偶數,因為你在前面迴圈裡面沒有判斷是否是偶數// 你是從3開始判斷的。

if (i%j != 0 &&i%2 !=0)}return sum;

int main()

26樓:時間空間無限維

第二個for j的迴圈結束的太早了吧?要等第二個if語句結束才結束。

怎麼用c語言判斷數是不是素數,怎麼用c語言判斷一個數是不是素數

解釋如下 include stdio.h include math.h main include stdio.h include math.h void main 最佳方案是用素數分佈來處理,在處理大素數時尤其合理,用算術基本定理可能太慢了。如果知道素數分佈相關知識,編出來還是很容易的,不然告訴你也...

c語言素數判斷為什麼只迴圈到平方根就行

這兒有你想要的bai回答 因為如果n可以被du一個zhi數整除,那麼其中一個數一定小於等dao於n開方,內另一個大於等於n的開方,所以容只需要算到這兒,到後面就是多餘的了 素數是抄 除1和本身 外,沒有襲其他因子。假設 這個數baix的 平方根 du為 a。證明,比a大的比本身zhix小的dao沒有...

c語言程式設計 設計函式用於判斷數是否為素數,如果是素數返回1,否則返回

源程式 以及演算法解釋如下 define crt secure no warnings include int func int m 判斷函式int main 程式執行結果如下 擴充套件資料 輸出1 100之間的所有素數程式如下 include int primenumer int x 定義一個函式...