我编写了以下代码来检查数字是否为素数。我知道还有其他的,也许更好的方式来做我,但我只是想知道这个方法有什么问题。它正确地识别数字是否为素数,但是如果我是素数,它会给出分割错误。
代码:
#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没有区别。
答案 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);