【问题标题】:Determine Prime Numbers using SINGLE do-while Loop使用 SINGLE do-while 循环确定素数
【发布时间】:2014-03-06 01:47:58
【问题描述】:

我按照教授的指示编写了这个程序。结果他希望我们使用 SINGLE do-while 循环。虽然我在技术上这样做了...这不会飞。如果不使用 for 循环或至少另一个其他类型的循环,我无法弄清楚如何做到这一点。他说它可以使用continuebreak 语句——但这可能没有必要。

我希望不只是重写我的代码——虽然这很方便,但我并没有很好地从中学习。

感谢所有帮助。

int main() {

int max, x, n = 2; //init variables
//start n at 2 because 1 isn't prime ever

//asks user for max value
printf("Enter max number: ");
scanf("%i", &max);

/*prints prime numbers while the max value
is greater than the number being checked*/
do {
    x = 0; //using x as a flag
    for (int i = 2; i <= (n / 2); i++) {
        if ((n % i) == 0) {
            x = 1;
            break;
        }
    }
    if (x == 0) //if n is prime, print it!
        printf("%i\n", n);
    n++; //increase number to check for prime-ness
} while (n < max);

return 0;
}

【问题讨论】:

  • 我不明白如何只用一个循环就可以轻松完成。这意味着确定素数的 O(1) 算法。没有这种方法是已知的。
  • 可以使用 if 语句吗?
  • @KRUKUSA 我会这么认为。他没有说我们不能。
  • @Nate 你确定程序必须打印 all 个低于特定限制的素数吗?也许输入应该是一个然后被测试的数字? 可以通过一个循环轻松完成。但不是前者!
  • @dvnrrs 我确定这就是他要问的。当谈到我们对 C 的预期知识时,我的老师有点可笑。我觉得这门课很简单——但它的内容让我摸不着头脑。

标签: c loops do-while


【解决方案1】:

这是绝对可行的。诀窍是有一个 test 变量,并且每次迭代通过您的 while 循环,检查 test 变量与您当前的数字。 test 变量总是从 2 开始(每个自然数 > 0 都可以被 1 整除)

需要考虑的案例:

  • 我们当前的数字可以被测试变量整除——数字不是素数,增加当前数字并重置测试变量。
  • 我们的测试变量大于当前数字的平方根。根据定义,它不能除当前数,所以当前数必须是素数(我们尝试了所有低于当前数平方根的数,但没有一个能除它)。增加当前数字并重置测试变量。
  • 最后,如果上述任何一种情况都不成立,我们必须尝试下一个更高的数字。增加测试变量。

我没有提供您要求不要重写的代码,但如果您愿意,可以提供。

编辑

#include <stdio.h>
#include <math.h>

int main(void)
{
    int max = 20;
    int current = 4;
    int checker = 2;
    do{
        if(checker > sqrt((double)current))
        {
            checker = 2;
            printf("%d is prime\n",current);
            current++;
        }
        else if(current % checker == 0)
        {
            checker = 2;
            printf("%d is NOT prime\n",current);
            current++;
        }
        else
            checker++;
    }while(current < max);
}

输出:

4 is NOT prime
5 is prime
6 is NOT prime
7 is prime
8 is NOT prime
9 is NOT prime
10 is NOT prime
11 is prime
12 is NOT prime
13 is prime
14 is NOT prime
15 is NOT prime
16 is NOT prime
17 is prime
18 is NOT prime
19 is prime

【讨论】:

  • 不是有两个循环吗?
  • @self。不仅仅是一个do while,还有一个ifif elseelse
  • @C.B.如果不是太麻烦的话,我想看看这个的代码。解释就足够了——但我认为在这种情况下它会很有用。
  • 这可行,但它不是编写程序控制流的最佳方式。如果这是讲师想要的,那么他并不是在教授良好的 C 编程实践!
  • @C.B.我没看到。你的解释不完整。至少提供伪代码。 /好奇
【解决方案2】:

我不会给你确切的代码,但有两个指针可以帮助你:

首先,for循环可以写成while循环(反之亦然)

for (int i=0; i< 100; ++i)
...

会变成:

int i=0;
while (i < 100)
{
  ...
  ++i;
}

第二,两个嵌套循环可以通过多种方式变成一个循环:

for (int i=0; i< 100; ++i)
  for (int j=0; j< 100; ++j)
    ...

变成

for (int z=0; z< 100*100; ++z)
{
  i = z / 100;
  j = z % 100;
}

上面显示了两个 for 循环,但您可以在其他循环上执行类似的转换。

【讨论】:

    【解决方案3】:

    想想 Eratosthenes 筛子。在这种方法中,我们从表中删除合数,因此最后只剩下素数。为简单起见,该表仅包含奇数。你开始指向 3,这是一个素数。三振 3*3, 3*5... 完成你在桌子上的跑动(它是有限的),指向 5。它没有被三振,因此是一个素数。删除 15, 25... 检查 7, 素数, 打击 21, 35... 检查 9, 已经被删除, 移动到 11...

    问题:

    1. 您刚刚检查了一个号码,下一个要检查的号码是什么?
    2. 你怎么知道你的号码已经用完了?

    写下这些问题的答案,你就有了一个单循环素数查找算法。

    【讨论】:

      猜你喜欢
      • 2016-03-27
      • 2016-09-18
      • 1970-01-01
      • 2021-07-18
      • 2013-02-16
      • 1970-01-01
      • 1970-01-01
      • 2021-07-01
      • 1970-01-01
      相关资源
      最近更新 更多