【问题标题】:Determining if a user inputted variable is prime in a do-while loop在 do-while 循环中确定用户输入的变量是否是素数
【发布时间】:2015-02-25 06:00:33
【问题描述】:

所以我的任务如下:构造一个do-while()循环,它继续提示用户输入一个整数,并确定输入的整数的总和,直到遇到一个素数。质数不应包含在总和中。显示所有变量声明。

我已正确添加所有变量,但似乎无法让函数停止在素数上。为了尝试纠正这个问题,我制作了变量“primecheck”并将其设置为 2++,认为它将是大于 2 的每个整数(显然不可能,但可以希望)。任何帮助将不胜感激!

int main (void)
{
    int sum = 0, num = 0, i = 0, primecheck = 0, two = 2;

    primecheck = two++;
    do
    {
            printf ("Enter an integer: ");
            scanf ("%d", &num);
            if (num % primecheck == 0 && primecheck != num)
            {
                sum += num;
            }
    } while (num % primecheck == 0 && primecheck != num);

    i = sum;
    printf("%s%d%s", "Sum = ", i, "\n");

}

【问题讨论】:

  • two = 2, two++。我知道“魔术”数字很糟糕,但真的吗?特别是因为现在two == 3.
  • 素数检查不是必须改变循环内的值吗?
  • 我不明白素数检查在实现中应该如何工作。
  • @codor 实际上,是的,我认为该方法不适用于此方法(也许它会对不起我的知识非常有限),但它必须是一个函数和一个 do-while 循环。如果输入的数字是素数,基本上循环不应该运行

标签: c primes


【解决方案1】:

一种可能性是引入一个执行素数检查的函数,这可以通过使用所有较小数字的检查除法来完成,并在找到素数后立即终止循环。可以在this link 之后找到一个实现;代码可以重构为以下函数以进行素性测试。如果n 是素数,则函数返回1,否则返回0。该实现使用明确的while 循环,因为需求显然需要它。

int is_prime(int n)
{
    int i=3;
    int flag=0;
    if (n%2==0)
    {
        return 0;
    }
    do
    {
        if (n%i==0)
        {
            flag=1;
            break;
        }
        i+=2;
    }
    while (i*i<=n);
    return flag;
}

【讨论】:

  • 谢谢!非常感谢
  • 至少,将 while 条件更改为 (i * i &lt;= n) - 这是 O(sqrt(n)) 与 O(n)。此外,不要测试大于 2 的偶数因子。考虑:n = 2000000000 - 这大约是 22360 次迭代与 1000000000 次。
  • 您现在将每个偶数都作为素数返回。
  • @BrettHale 感谢您的评论,但我相信原始发帖人要求的是最基本的解决方案。
  • @MicroVirus 感谢您的评论,这是一个错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-02
  • 2017-08-29
  • 2017-04-03
  • 2016-07-19
  • 2012-02-29
  • 1970-01-01
相关资源
最近更新 更多