在C中重复循环的怪异输出

时间:2019-01-10 19:20:09

标签: c

这是我查找素数的代码。

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循环(不仅是这个程序)时,输出都是这样。我该如何解决?

提前谢谢!(对不起,我的英语不好)

4 个答案:

答案 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++;
        }
    }
}