2013-04-01 4 views
1

숫자가 소수인지 확인하기 위해 다음 코드를 작성했습니다. 나는 다른 방법, 아마도 더 나은 방법을 알고 있지만, 나는이 방법으로 무엇이 잘못되었는지 알고 싶다. 숫자가 소수인지 여부를 정확하게 식별하지만 i가 소수 인 경우 세그먼트 화 오류가 발생합니다.세그먼트 화 오류를주는 소수 검사 코드

코드 :

#include<stdio.h> 
void prime(int); 
int main() 
{ 
    int a; 
    printf("Enter number\n"); 
    scanf("%d",&a); 
    prime(a); 
    return 0; 
} 

void prime(int a) 
{ 
    static int k=2; 
    if((a%k==0)&&(a!=k)) 
     printf("Not a prime\n"); 
    else 
    { 
     k++;     
     if(a==k) 
      printf("Prime\n");  
     prime(a); 
    } 
} 

참고 : 코드를 수정하려고, 나는 당신이 == K 또는 K를 사용하는 경우가 더 차이가 없다는 것을 발견 == 다른 조건에서-1.

+3

특히 생산하지 않습니다. 디버거를 사용하거나 인쇄 문을 추가하여 프로그램의 진행 상황을 추적하고 발생할 것으로 예상되는 것과 비교하여 문제를 격리해야합니다. 이 둘이 갈라지면 문제를 발견했습니다. (그리고 필요하다면 [최소한의 테스트 케이스] (http://sscce.org)를 만들어야한다.) –

답변

6

무한 재귀 -> 스택 오버플로.

7

첫 번째로 재귀가 멈추지 않습니다.

두 번째로, static 상태는 정말 나쁜 생각입니다. 코드를 테스트하기가 쉽지 만 스레드로부터 안전하지는 않습니다. 더 나쁜 것은 prime() 번으로 다시 전화하면 첫 번째 전화에서 상태가 유지됩니다.

마지막으로 재귀는 여기에서 완전히 불필요하며 반복적으로 반복으로 변환 될 수 있습니다.

3

코드는 주요 사건으로 종료되지 않습니다. 당신이 필요합니다

if (a==k) 
    printf("Prime\n");  
else 
    prime(a); 
0
if(a==k) 
     printf("Prime\n"); /* Q: What happens after you find it to be prime? */ 
    prime(a);    /* A: You test it for primeness again..? */ 

난 당신이 의미 생각 : 코드에서 오류를 발견하는 사람을 물어

if(a==k) 
     printf("Prime\n"); 
    else 
     prime(a);