在C语言中与初学者级别的循环函数苦苦挣扎

时间:2019-10-15 00:44:56

标签: c loops nested-loops

我似乎无法识别逻辑中的错误,也无法查明程序为什么要打印其数字。分配是创建一个程序,该程序将列出从1到用户输入“ n”的所有素数。非常感谢,请告诉我是否以任何方式错误地格式化了此问题。

#include <stdio.h>

void prime(int);
int main(void)
{
    int number;
    printf("Enter your n:\n");
    scanf("%d", &number);
    printf("Prime number(s) from 1 to %d : ", number);
    prime(number);

    return 0;
}
void prime(int n)
{
    int i, j, primecounter = 0;
    for (i = 0; i <= n; i += 1)
    {
        for (j = i; j > 0; j -= 1)
        {
            if (i % j == 0)
            {
                primecounter += 1;
                if (primecounter > 2)
                    continue;
            }
            printf("%d", i);
        }
    }
}

3 个答案:

答案 0 :(得分:0)

您的程序每次开始测试新的primecounter时,都无法将i重置为0。

如果未执行continue之后的if (primecounter > 2),则在循环的每次迭代中使用printf执行之后的j。你不希望出现这种情况。您只想在j上的循环完成后才打印,然后仅在primecounter为2时才打印。(它应该真正地称为factorcounter,因为它是考虑因素而不是素数。)

printf中,使用"%d\n"而不是"%d",以便每个数字都打印在单独的行上。

答案 1 :(得分:0)

这是解决问题的完整代码。

#include <stdio.h>

void prime(int);
int main(void)
{
    int number;
    printf("Enter your n:\n");
    scanf("%d", &number);
    printf("Prime number(s) from 1 to %d : ", number);
    prime(number);

    return 0;
}
void prime(int n)
{
    int i, j;
    for (i = 0; i <= n; i += 1)
    {
        bool prime=true;
        for (j = i/2 /*changed it to i/2 for better performance*/; j > 1; j -= 1) //echo through the numbers
        {
            if (i % j == 0){prime=false;break;} //so long as there is a number that can be divided well, the FOR is broken out setting prime false 
        }
        if(prime)printf("%d\t",i); //prime is true only when there is NO number that can be divided well
    }
}

答案 2 :(得分:0)

解决此问题的另一种方法(更好的是,我认为)是将第二个for循环更改为从i / 2开始只检查2以便仅检查整数,然后添加一个if语句来检查primecounter是否为大于零,而不是非质数。同样不要忘记在检查完每个数字后将质数计数器初始化为零。

primecounter=0;
for (int j=i/2;i>=2;j--){
if (i%j==0)
 primecounter++;
}
if (primecounter)
      printf("%d \n",i);
}