2013-04-28 2 views
0

나는 1179908154라는 잘못된 대답을 계속하고있다. 처음에 나는 그것이 int가 아닌 내 총합 변수에 있다고 비난했다. 나는 긴 타입을 주었지만 동일한 대답을 얻는다. 생각?프로젝트 오일러 : 소수의 합계 ... 왜이 방법이 효과가 없을까요?

// Project Euler 

// Problem 10 

#include <iostream> 
#include <cmath> 
using namespace std; 

void main() 
{ 

int p = 3; 
long sum = 2; 
bool isPrime; 
for (p; p < 2000000; p++) 
{ 
    isPrime = true; 

    for (int i = 2; i <= sqrt(static_cast<double>(p)); i++) // cast into double for sqrt function 
    { 
     if (p % i == 0) 
     { 
      isPrime = false; 
      break; 

     } 
    } 
    if (isPrime == true) 
    { 
     cout << p << endl; // show each prime 
     sum += p; // add prime to sum 
    } 

} 
cout << sum << endl; // show sum 

system("pause"); 

}

+0

'sizeof (long)'은 구현시 4입니다. 32 비트가 너무 작아서 합계를 유지할 수 없습니다. –

+0

정확합니다. 고맙습니다! 나는 오래 오래 대신 사용했다. – Shane

답변

0

루프를 들어, SQRT (P)까지 번호를 확인해야합니다 당신의 경계를 가하고 + 1. 당신은 제곱근을 계산할 때 소수점 오류 부동 얻을 수 있습니다 (그것을 과소 평가 할 수 약간), 잠재적 인 요인들이 루프에서 체크되지 않을 수도 있습니다.

+0

은 53 비트의 정밀도를 가지므로 정확하게 53 비트 정수를 나타낼 수 있습니다. int는 (일반적으로) 32 비트입니다. 따라서 이중으로 주조하는 것은 문제가되지 않습니다. – ronalchn

+0

이 코드를 실행하려고 시도했지만 현재 실행되지 않습니다. 컴파일러는 main의 타입을 int로 바꾸라고 말했고, 나는 그것을 수행 한 이유가 아니기 때문에 마지막에 그 시스템 ("일시 중지")을 없앴습니다. 어쨌든, 내가 실행할 때 1179908154와는 다른 대답을 얻습니다. 이전 버전의 코드를 실행하지 않습니까? – SparkleStilettos

+0

사실 제곱은 제곱근보다 빠르며 부동 소수점 응답이 없으므로 더 좋은 방법은'i * i <= p'입니다. – Justin

2

어쩌면 플랫폼에 따라 값을 보유하기에 충분하지 않을 수도 있습니다. 대신 오래 오래 사용해보십시오.

2

혼자서 소수 생성기를 쓰지 마십시오. 실제로 쉽지 않습니다. 그냥 http://cr.yp.to/primegen.html을 사용하십시오. 프로젝트 오일러에 충분합니다.

+0

나는 프로젝트 오일러의 목적이 쉽지 않다고 생각한다. 당신이 그 A-ha를 얻을 때까지 당신에게 도전해야한다! 순간. –