打印输出 C 的问题

Problems with printing output C

所以我要为学校写代码。我做到了,但我的输出不是他们要求的方式。这段代码给了我两个不同数字之间的素数。所以我必须按行打印这些数字。但是,是的,下面的答案之间有零,您可以明白我的意思。我该如何解决这个问题?

#include <stdio.h>

int is_prime (int number)
{
    int is_prime= 1, i;

    if (number < 2)
    {
        is_prime = 0;
    }
    else
    {
        for(i = 2; (i * i) <= number; i++)
        {
            if ((number % i) == 0)
            {
                is_prime = 0;
                break;
            }
            else
            {
                is_prime = 1;
            }
        }
    }
    return is_prime;
}

int main (void)
{
    int lower_limit, upper_limit, i;

    scanf("%d\n%d", &lower_limit, &upper_limit);

    for(i = lower_limit; i <= upper_limit; i++)
    {
        if (is_prime (i))
        {
            printf("\n%d", i);
        }
        else
        {
            printf("\n%d", is_prime(i));
        }
    }
    return 0;
}

输出

0
11
0
13
0
0
0
17
0
19
0

参考

11
13
17
19

它在这个 if 块中:

    if (is_prime (i))
    {
        printf("\n%d", i);
    }
    else
    {
        printf("\n%d", is_prime(i));
    }

这里说的是“如果数字是素数,则打印它,否则打​​印它是否是素数(此时你已经确定它不是)”。

只需删除 else 块。

如果数字是素数就打印出来。不需要其他 - 更糟糕的是它是不正确的。

您可以简单地使用 is_prime 函数

int is_prime (int number)
{
    int is_prime = number > 1, i;

    for(i = 2; (i * i) <= number; i++)
    {
        if ((number % i) == 0)
        {
            is_prime = 0;
            break;
        }
    }
    return is_prime;
}


int main (void)
{
    int lower_limit, upper_limit, i;

    scanf("%d\n%d", &lower_limit, &upper_limit);

    for(i = lower_limit; i <= upper_limit; i++)
    {
        if (is_prime (i))
        {
            printf("\n%d", i);
        }

    }
    return 0;
}

https://godbolt.org/z/4d8qhx

另一个问题:溢出。

避免 inti*i 中溢出,这是 未定义的行为 (UB)。 当 numberINT_MAX 附近的素数时,就会发生这种情况。

 // for(i = 2; (i * i) <= number; i++)
 for(i = 2; i <= number/i; i++)

一个好的编译器会看到附近的 number%inumber/i 并为它们两个生成高效的代码,因此不会产生昂贵的第二次操作。


upper_limit == INT_MAX

时下面也会溢出
for(i = lower_limit; i <= upper_limit; i++)

也许

for(i = lower_limit; i - 1 < upper_limit; i++)

只要lower_limit > INT_MIN.

就可以