检查素数给出分段错误的代码

时间:2013-04-01 14:38:24

标签: c

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

代码:

#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);
    }
}

注意:在尝试修改代码时,我发现在else条件下使用== k或k == a-1没有区别。

4 个答案:

答案 0 :(得分:7)

首先,你的递归永远不会停止。

其次,static状态是一个非常糟糕的主意。它使代码难以测试而不是线程安全。更糟糕的是,如果你第二次打电话给prime(),它仍会保持第一次通话状态。

最后,这里完全没有必要进行递归,并且可以简单地转换为迭代。

答案 1 :(得分:6)

无限递归 - &gt;堆栈溢出。

答案 2 :(得分:3)

您的代码永远不会退出。你需要:

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

答案 3 :(得分: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);