2011-01-18 7 views
-1

第2章の「恐怖なしの初心者ガイド」の第2章では、素数プログラムの一環としてコード:while(i <= sqrt(static_cast <double>(n))

while (i<=sqrt(static_cast<double>(n)) 

「i」が「2」に初期化され、「n」はされたと仮定すると、ユーザーの入力である

なぜ私たちは「SQRT」と比較されています。 「n」自体ではなく「n」自体ではありません。

ありがとう

+0

のように、これはループ内で何が起こっているかによって決まります。答えがなければ "それのように感じた! – Nim

+0

現時点の回答以外にも、この情報は有益です。http://mathforum.org/library/drmath/view/56715.html –

答えて

3

数値にそれ自身と1以外の要因がある場合、それらの要因の少なくとも1つは数値のsqrtより小さくなるためです。

0
while (i<=sqrt(static_cast<double>(n)) 

は、著者は、コードの他の部分に依存してもよい最初のソリューションを選択する理由

while(n >= i*i) 

に相当します。

+0

@Paul:Ups ..ありがとう;) – BlackBear

6

> non-primesが> sqrt(n)の要素を取得しないため(既に他の小さな要素が見つかっているはずです)

それのようにそれを書くためにはるかに良いだろう、しかし本当に悪いテストです:コードはこのように書き

while (i*i <= n) 
+1

+1スマートな比較のために! – Nawaz

+0

実際、iを反復しているので、反復ごとにiを正方形にしたくありません。 nは非常に大きくなることがあり、それは反復ごとに余分な乗算になります。私たちがする必要があるのは、ループテストからsqrtを取り除くことだけです。ソースの中では、sqrtの結果はループ不変であるため、とにかくコンパイラによって最適化されます。 – ThomasMcLeod

+0

@トーマス:良い点 - それはより良い解決策になります。それはとにかく素数を見つけるためのひどいアルゴリズムなので、アルゴリズムのより良い選択はさらに効果的です。 –

0

i = 2; 
while (i <= sqrt(static_cast<double>(n)) { 
    if (n % i == 0) is_prime = false; 
    i++; 
} 

Nのであれば、ループがチェックされます残余なしでiで割り切れる。明らかに、nの平方根(これを含む)をチェックしなければならない(n/p = qの場合はn/q = p)。

0

アルゴリズム上、ターゲットの平方根までの可能な要素をチェックするのは正しいです。

Nが素数であるかもしれないし、そうでないかもしれない数である場合、(1を含まない)要素(sqrt(N)まで)がない場合、Nは素数でなければならない。 sqrt(N)自体は、その唯一の素因数である可能性があります(例えば9は3 * 3)。

17が素数であるかどうかを調べる場合、sqrt(17)は4のすぐ上にあることがわかります.2,3および4は17に分割されないので、5が大きいほど素数でなければなりません。

5分の17が5未満になると、あまりにも要因でなければならないので、これはケースでなければなりませんが、我々は何の要因はもちろんの5未満

プログラムでは、コードが最適化されていませんがない知っていますあなたが2倍と平方根を使うのではなく、(i * i < = N)

関連する問題