使用SINGLE do-while循环确定素数

时间:2014-03-05 16:36:10

标签: c loops do-while

我根据教授的指示写了这个程序。事实证明他希望我们使用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;
}

3 个答案:

答案 0 :(得分:3)

肯定是可行的。诀窍是拥有一个测试变量,并通过while循环进行每次迭代,检查测试变量与当前数字。始终在2处启动测试变量(每个自然数&gt; 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

答案 1 :(得分: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循环,但是你可以在其他循环上执行类似的转换。

答案 2 :(得分:0)

想想Eratosthenes的筛子。在这个方法中,我们从表中打出复合数字,这样最终只剩下素数。为简单起见,该表仅包含奇数。你开始指着3,这是一个素数。击出3 * 3,3 * 5 ...完成你在桌子上的跑(它是有限的),指向5.它没有被击出,因此是一个素数。罢工15,25 ......检查7,素数,罢工21,35 ......检查9,已经被击出,继续前进到11 ...

问题:

  1. 您刚刚查了一个号码,下一个要检查的号码是什么?
  2. 你怎么知道你的数字用完了?
  3. 写下这些问题的答案,你就有了一个单循环的寻找算法。