2013-04-01 53 views
1

我写了以下代码来检查数字是否为素数。我知道还有其他的,也许更好的方法来做我,但我只想知道这种方法有什么问题。它正确地识别数字是否为素数,但是如果我是素数,它会给出分割错误。用于检查产生分段错误的素数的代码

代码:

#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 == A-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);