我正在编写一个程序来查找从1到100的素数。请检查我的代码是否正确。当我运行我的代码时,素数不会被打印出来。请帮忙。
#include <stdio.h>
#include <conio.h>
int main()
{
int i, j, flag, rem;
flag=0;
printf("2");
for(i=3; i<=100; i++)
{
for(j=2; j<=i; j++)
{
rem = i%j;
if(rem == 0)
{
flag=1;
break;
}
}
if(flag==0)
{
printf("%d", i);
}
}
getch();
return 0;
}
答案 0 :(得分:2)
你有几个问题
首先,for(j=2;j<=i;j++)
循环应为for(j=2;j<i;j++)
,就好像j等于i,j % i == 0
将始终为真
其次,你的标志变量没有做你认为它正在做的事情。正如HolyBlackCat所说,这是一个学习如何使用调试器来查看正在发生的事情的好机会。您需要重置flag变量,因为一旦找到单个复合数字,您的标志将不会重置,因此所有后续数字都将标记为复合。添加:
for(i=3;i<=100;i++)
{
flag = 0;
for(j=2;j<=i;j++)
{
答案 1 :(得分:2)
将for (j = 2; j <= i; j++)
更改为for (j = 2; j <= i/2; j++)
。您需要循环到i/2
。
int main()
{
int i, j, flag, rem;
printf("2\n");
for (i = 3; i <= 100; i++)
{
flag = 0;
for (j = 2; j <= i/2; j++)
{
if (i % j == 0)
{
flag = 1;
break;
}
}
if (flag == 0)
printf("%d\n", i);
}
getch();
return 0;
}
答案 2 :(得分:2)
为了阅读目的,最好有正确的缩进。我在行中添加了一些注释,您可以优化代码,并删除了不必要的&#39; printf&#39;。 (\ t是在打印之后写一个标签空间)
#include <stdio.h>
#include <conio.h>
int main()
{
int flag;
printf("Prime numbers: 2\t");
for(int i = 3; i <= 100; i++) // You can declare a temporal variable for the cycle
{
flag = 0; // reset the flag variable to zero when adding a new number
for(int j = 2; j < i; j++)
{
if(i%j == 0) // substitute the 'rem' variable for an operation
{
flag = 1;
break;
}
}
if(flag == 0)
{
printf("%d\t", i);
}
}
getch();
return 0;
}
预期输出为:
Prime numbers: 2 3 5 7 11
13 17 19 23 29 31 37
41 43 47 53 59 61 67
71 73 79 83 89 97
答案 3 :(得分:1)
每次尝试新号码时,都应将flag
重置为0。保留这样的代码,一旦数字不是素数,代码将永远不会再打印。
[...snip...]
for(i=3;i<=100;i++)
{
flag = 0;
for(j=2;j<=i;j++)
{
[...snip...]
答案 4 :(得分:1)
问题是flag
未正确设置/重置。而且代码还有很大的改进空间。
2..n-1
2..n/2
分开
醇>
找到以下优化代码:
// return 1 if no is prime else 0
int is_prime(int n)
{
for(int i = 3; i<= n/2; i+=2){
if (n%i == 0)
{
return 0;
}
}
return 1;
}
int main()
{
printf("2\n");
for(int i=3; i<=100; i+=2)
{
if (is_prime(i))
{
printf("%d\n", i);
}
}
return 0;
}