2011-01-18 8 views
-1

2 장 : 결정, 의사 결정에서 "두려움이없는 C++ : 초보자 안내서" 소수 프로그램의 일환으로 코드 :while (i = = sqrt (static_cast <double> (n))

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

는 "내가" "2"로 초기화하고, "N"것을 제공은 사용자의 입력

우리는 왜 "SQRT"에 비교된다. "n"자체가 아닌 "n"자체?

감사합니다.

+0

이것은 루프에서 무슨 일이 일어나고 있는지에 달려 있습니다. 그 대답이 없으면 "저자, 저자 그것을 느꼈다! " – Nim

+0

현재 답변 외에도 다음 정보가 유용 할 수 있습니다. http://mathforum.org/library/drmath/view/56715.html –

답변

3

숫자에 자체 및 1 이외의 다른 요소가있는 경우 이러한 요소 중 하나 이상이 숫자의 sqrt보다 작을 수 있습니다.

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

은 저자가 코드의 다른 부분에 따라 달라질 수 있습니다 최초의 솔루션을 선택하는 이유

while(n >= i*i) 

에 해당합니다.

+0

@Paul : Ups .. thanks;) – BlackBear

6

당신은> primrt (n) (당신은 이미 다른 작은 인자를 발견했을 것입니다)에 대한 어떤 인자도 얻지 못할 것이기 때문에.

그것은로 작성하는 더 나은 것, 정말 나쁜 테스트 비록입니다 :

while (i*i <= n) 
+1

+1 스마트 비교! – Nawaz

+0

사실, 우리는 iterating 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이 소수 일 수도 있고 아닐 수도있는 수이면 sqrt (N)까지의 요소 (1을 포함하지 않음)가없는 경우 N은 소수이어야합니다. sqrt (N) 자체가 유일한 소수 요소 일 수 있습니다 (예 : 9 * 3 * 3).

17이 소수인지 알아보기 위해 테스트 할 경우 sqrt (17)은 4보다 큰 값입니다. 2, 3 및 4는 17로 나누지 않으므로 5가 더 클 때 소수 일 것입니다.

5분의 17 5보다 적을 것이다 너무 요인이 될해야하기 때문에이 사건해야하지만 우리가

미만 5. 프로그래밍 물론 코드가 최적이 아닌 어떤 요인이 없는지 알고 당신이 복소와 제곱근을 사용하지는 않지만 (i * i < = N)