2014-09-25 4 views
0

내가 값 N.까지 소수를 출력하는 프로그램을 작성하기 위해 노력했습니다소수 계산기 C++

프로그램을 실행하면 예상대로, 내가 입력 N의 값을 묻는 메시지가하고 있지만, return을 누르면 프로그램이 종료됩니다. 나는 문제가 break 문에 거짓말 같아요 :

if (modulo == 0) break; 

'휴식'만을 중첩 루프를 끝낼 것을 읽고 둘에도 불구하고, 내가 잘못 갈 수있는 유일한 방법으로 그것을 참조하십시오. 이것을 '계속'으로 바꾸면 프로그램은 N에서 0까지의 모든 정수를 출력하므로 N = 20을 입력하면 출력은 20, 19, 18, ... 3, 2,

관련 항목 섹션의 코드는 다음과 같습니다. C++ 초보자를위한 도움/조언이 있으면 크게 환영 할 것입니다.

int N, f; 
float modulo; 

cout << "Welcome to the prime number sieve\n"; 
cout << "Enter the number up to which the prime numbers will be printed: "; 
cin >> N; 

for (int j = N; j != 1; j--) {    
    f = j; 

    for (f; f != 0; f--) { 
     modulo = j%f; 
     if (f == 1) { 
      cout << j << ", "; 
     } 
     if (modulo == 0) break; 
     }           

} 

    return 0; 
+0

코드를 단계별로 실행하십시오 (수동으로 펜 및 종이로 또는 디버거를 사용하여 시도하십시오). 이것은 실제로 여기서 일어나고있는 것을 알아내는 데 도움을 줄 것입니다 (특히 내부 루프에서 계산 될 때 '모듈러스'의 값을 살펴보십시오). – SleuthEye

+0

시간 내 주셔서 감사합니다. SleuthEye, 다시 살펴 보겠습니다. – Tom

답변

1

알고리즘이 잘못되었습니다. 숫자가 무엇이든 관계없이 두 번째 루프의 중단이 바로 발생합니다.

입력이 20이라고 가정 해 보겠습니다. 그런 다음

첫 번째 반복 :

j = 20 
f = j = 20 
modulo = 20 % 20 = 0 
break 

초 반복 : 등등

j = 19 
f = j = 19 
modulo = 19 % 19 = 0 
break 

그리고는 ... 당신이해야 할 첫 번째 일은이 Sieve of Eratosthenes

그리고 당신의 프로그램을 찾아 볼 것입니다, 어떻게 시합이 (Explanation) :

for (int j=2; j < N; j++) { 
    for (int f = 2; f*f <= j; f++) { 
     if (j % f == 0) { 
      break; 
     } 
     else if (f+1 > sqrt(j)) { 
      cout << j << " "; 
     } 
    } 
} 
+0

나는 그것을 이해한다, 내 부분에 어리석은 실수를 참조하십시오. 정말로 네엠 감사합니다! – Tom

+0

@Tom 우리 모두 실수를 저의 친구로 만듭니다 :) 항상 디버거에서 코드가 마음에 들지 않으면 작동하지 않습니다. 브레이크 포인트는 마술을 일으킬 수 있습니다 :) – nem035