2 장 : 결정, 의사 결정에서 "두려움이없는 C++ : 초보자 안내서" 소수 프로그램의 일환으로 코드 :while (i = = sqrt (static_cast <double> (n))
while (i<=sqrt(static_cast<double>(n))
는 "내가" "2"로 초기화하고, "N"것을 제공은 사용자의 입력
우리는 왜 "SQRT"에 비교된다. "n"자체가 아닌 "n"자체?
감사합니다.
2 장 : 결정, 의사 결정에서 "두려움이없는 C++ : 초보자 안내서" 소수 프로그램의 일환으로 코드 :while (i = = sqrt (static_cast <double> (n))
while (i<=sqrt(static_cast<double>(n))
는 "내가" "2"로 초기화하고, "N"것을 제공은 사용자의 입력
우리는 왜 "SQRT"에 비교된다. "n"자체가 아닌 "n"자체?
감사합니다.
숫자에 자체 및 1 이외의 다른 요소가있는 경우 이러한 요소 중 하나 이상이 숫자의 sqrt보다 작을 수 있습니다.
while (i<=sqrt(static_cast<double>(n))
은 저자가 코드의 다른 부분에 따라 달라질 수 있습니다 최초의 솔루션을 선택하는 이유
while(n >= i*i)
에 해당합니다.
@Paul : Ups .. thanks;) – BlackBear
당신은> primrt (n) (당신은 이미 다른 작은 인자를 발견했을 것입니다)에 대한 어떤 인자도 얻지 못할 것이기 때문에.
는그것은로 작성하는 더 나은 것, 정말 나쁜 테스트 비록입니다 :
while (i*i <= n)
+1 스마트 비교! – Nawaz
사실, 우리는 iterating i를하기 때문에 각 반복에서 i를 정사각형으로 만들고 싶지는 않습니다. n은 매우 클 수 있으며 반복마다 추가 곱셈이됩니다.우리가해야 할 일은 루프 테스트에서 sqrt를 빼내는 것뿐입니다. sqrt의 결과는 루프 불변이므로, 어쨌든 컴파일러에 의해 최적화 될 것이다. – ThomasMcLeod
@ 토마스 : 좋은 지적 - 더 나은 해결책이 될 것입니다. 물론 어쨌든 소수를 찾는 것은 끔찍한 알고리즘이므로 알고리즘의 더 나은 선택은 더욱 효과적입니다. –
코드는 다음과 같이 진행됩니다
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
).
알고리즘 적으로 가능한 목표 요소의 제곱근까지 가능한 요소를 확인하는 것이 옳습니다.
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)
이것은 루프에서 무슨 일이 일어나고 있는지에 달려 있습니다. 그 대답이 없으면 "저자, 저자 그것을 느꼈다! " – Nim
현재 답변 외에도 다음 정보가 유용 할 수 있습니다. http://mathforum.org/library/drmath/view/56715.html –