这是我查找素数的代码。
int main (void){
int p, d;
_Bool isprime;
for (p=2;p<=50;++p){
isprime = 1;
for (d=2;d<p;++d){
if (p%d == 0)
isprime = 0;
if (isprime != 0)
printf("%i ", p);
}
}
return 0;
}
该程序的输出为
3 5 5 5 7 7 7 7 7 9 11 11 11 11 11 11 11 11 11 13 13 13 13 13 13 13 13 13 13 13 15 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 21 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 25 25 25 25 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 33 35 35 35 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 39 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 45 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 49 49 49 49 49
数字似乎正确,但是它们是重复的。我的代码有问题吗?还是编译器有问题?每次我使用for循环(不仅是这个程序)时,输出都是这样。我该如何解决?
提前谢谢!(对不起,我的英语不好)
答案 0 :(得分:2)
您的代码存在的问题是,对于相同的p
值,它会多次打印p
。就像注释中的Eugene Sh.一样,可以通过将if
语句上移至外部for
循环来轻松解决。我还将is_prime
更改为bool
的值,并编辑了它的设置方式。
int max_p = 50;
int p, d;
bool is_prime;
for (p = 2; p <= max_p; ++p) {
is_prime = true;
for (d = 2; d < p; ++d) {
if (p % d == 0) {
is_prime = false;
break;
}
}
if (is_prime) {
printf("%i ", p);
}
}
我将假定我使用C ++不会有所作为。
答案 1 :(得分:0)
您需要将printf
行放在内循环之外。
赞:
int main (void)
{
int p, d;
_Bool isprime;
for (p=2;p<=50;++p){
isprime = 1;
for (d=2;d<p;++d){
if (p%d == 0) {
isprime = 0;
break;
}
}
if (isprime)
printf("%i ", p);
}
return 0;
}
答案 2 :(得分:0)
其他人给出了提示。其中有些有用,有些则没有。最终目标是仅打印所有素数。因此,检查数字6是否为质数,我们从d = 2开始。因此,我们检查6%2。那么等于0。我们知道6不是质数。我们应该继续前进到7。相反,我们已经将2递增到3,现在我们再次检查。 6%3 ...对于少于我们要检查的数字的每个数字,我们都会这样做。这极大地增加了计算复杂度。该程序非常接近BigTheta(n ^ 2)。一种简单的运行方式是do-while循环或使用break语句。由于您使用的是C,因此请将int用作bool标记(以防止另一个lib导入)。您的内循环看起来像这样:
int is_prime = 1;
for (d = 2; d < p; d++)
{
if (p % d == 0)
{
is_prime = 0
break;
}
}
if (is_prime)
printf("%d ", p);
还有其他降低复杂性的方法,但是这些方法比更有效的代码更依赖于更好的算法设计。对于初学者的项目,请考虑一下为什么当前代码版本效率低下(即使它工作正常)。其中很多都是经验,但您不应忽略个别的代码和算法审查。
答案 3 :(得分:-1)
您必须使用break语句。不间断,每次执行计算,因此您的原始代码中有很多重复。但是即使使用break语句,您的代码也将生成许多非期望的数字/输出,而不仅仅是生成素数。因此,我为您编写了以下代码。它将根据您的问题生成素数。 使用以下代码生成最多为50的质数。
#include <stdio.h>
#include <stdlib.h>
int main ()
{
int prime,i,k,j,max;
printf("2\n");
printf("3");
for(i=4; i<max; i++)
{
if(i%2!=0 && i%3!=0 && i%5!=0 && i%7!=0)
{
prime=i;
printf("\n%d",prime);
k++;
}
}
}