【问题标题】:Problems with printing output C打印输出 C 的问题
【发布时间】:2020-09-17 14:08:50
【问题描述】:

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

#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

【问题讨论】:

    标签: c primes


    【解决方案1】:

    在这个if 块中:

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

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

    只需摆脱 else 块。

    【讨论】:

    【解决方案2】:

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

    你可以简单化 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

    【讨论】:

    • Nit - printf("%d\n", i); 所以程序是 POSIX 兼容的,或者在退出前添加一个 putchar('\n');
    • 是操作码。我没有改变它,因为它不是 OP 要求的
    • 是的,这就是我刚刚提到它的原因——否则它会搞砸你的提示:)
    【解决方案3】:

    另一个问题:溢出。

    避免i*i 中的int 溢出,这是未定义的行为 (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 &gt; INT_MIN就OK。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多