写此文字以找到2
至1000
之间的质数。但是它在显示2
和3
是质数之后停止。我知道我可以找到如何编写代码以在互联网上找出质数的方法。但是我真的需要知道这里出了什么问题。
#include <stdio.h>
main() {
int i, j;
int ifPrime = 1;
for (i = 2; i < 1000; i++) {
for (j = 2; j < i; j++) {
if (i % j == 0) {
ifPrime = 0;
break;
}
}
if (ifPrime == 1) {
printf("%d is prime\n", i);
}
}
}
答案 0 :(得分:3)
行
int ifPrime=1;
必须位于外部for
循环内。在那里,它将为每个i
初始化。这对应于自然语言单词“检查数字i是否为质数,首先假设它为质数,然后检查其是否为整数”。您之前的代码说过“检查2到1000是否为质数,首先假设它们是质数”,而这个措词太宽泛了。
代码应为:
int main()
{
for (int i = 2; i < 1000; i++)
{
int ifPrime = 1;
for (int j = 2; j < i; j++)
我将main
替换为int main
,因为这是20年以来的要求。 (您不应该从这些旧书中学习编程。)
我将int i
和int j
移到了for
循环中,以确保您不会意外地在已定义值的范围之外使用这些变量。
为避免将来出现此错误,建议将is_prime
计算提取到一个单独的函数中。这样一来,您将不得不在正确的位置初始化ifPrime
。
查找此错误原因的另一种方法是使用调试器逐步检查代码,并在每一步问自己:程序在做什么仍然有意义吗?
答案 1 :(得分:3)
在检查单个数字后,您没有将ifPrime设置回1。因此,一旦您获得非non-prime的数字,则ifPrime现在为0,因此if(ifPrime == 1)
将永远不会返回true,因此您只会看到2、3为质数
#include <stdio.h>
int main(void) {
for( int i=2;i<1000;i++)
{
int ifPrime = 1;
for(int j=2;j<i;j++)
{
if(i%j==0)
{
ifPrime=0;
break;
}
}
if(ifPrime==1)
{
printf("%d is prime\n",i);
}
}
return 0;
}