确定Prime或复合数

时间:2014-09-10 01:55:35

标签: c loops for-loop while-loop primes

我正在编写一个程序来确定给定的数字是素数还是复合数。我的代码是我到目前为止的代码。我认为使用WHILE LOOP不会像FOR LOOP那样有效,但我可能错了。

#include <stdio.h>

int main(int argc, const char* argv[]) {
    int num, i;

    printf("Enter a number you want to check:");
    scanf("%d", &num);
    if (num == 1) {
        printf("%d is neither prime nor composite", num);
    }
    i = 2;
    while (i <= num - 1) {
        if (num % i == 0) {
            printf("%d is composite\n\n", num);
            break;
        }
    }
}

该程序适用于大多数偶数,但是当我到达时,说9我没有得到回报,因为它没有除以3。我可以加入这个WHILE LOOP来补偿或者我会更容易使用FOR LOOP吗?

我在想,如果我使用了FOR LOOP,我就可以这样开始了。

    for (i = 2, i <= num, i++) {
        num % i == 0;
    }
    printf("%d is Composite", num);
}

2 个答案:

答案 0 :(得分:5)

你忘了增加循环中的索引

while (i <= num-1) {
    if (num%i==0) 
    {
        printf("%d is composite\n\n",num);
        return; // test is finished
    }
    i++;   // increase i by 1
}

printf("%d is prime number\n", num); // add this line to display the prime numbers also

修改

我刚刚看到你对for循环使用的评论:

for (i = 2; i < num; i++)  // ① be careful of ; and , ② i<num not i<=num
{
    if(num % i == 0)      //  if your num is dividable ==> not prime
    {
        printf("%d is Composite", num);
        return 0;      // return from the main func
    }
}
printf("%d is prime number\n", num);   // no divisor = no return = prime number

编辑2

现在让我们谈谈效率: 为了确定数字是否为素数,您可以迭代不到一半,怎么做?

如果p是数字,k是其除数,那么:

p = k * n

if ( n > sqrt(p)  && k > sqrt(p))
==> n * k > p

取任何一对除数为任意整数,两个除数不能同时大于整数的平方根!

这就是你可以这样迭代的原因:

while (i <= sqrt(num)) {
        if (num%i==0) 
        {
            printf("%d is composite\n\n",num);
            return; // test is finished
        }
        i++;   // increase i by 1
    }

所以对于你的10000你只迭代100次!而不是你想象的5000;)

<强>继续

如果你真的预算紧张,你只能检查大于2的奇数:D,我的意思是如果它不能被2分割那么它将永远不会被4,6,8分开。跳过它们

示例:

if(num%2 == 0) // check for 2
{
    printf("%d is composite\n\n",num);
    return;
}
while (i <= sqrt(num))  // check only for odd # greater than 2
{
     if (num%i==0) 
     {
         printf("%d is composite\n",num);
         return; // test is finished
     }
     i+=2;   // increase i by 2
}
printf("%d is prime\n", num);

答案 1 :(得分:2)

你写的地方:

 for (i = 2, i <= num, i++) 

你想要:

 for (i = 2; i < num; i++)

您可能也会想到为什么:

 for (i = 2, i*i <= num, i++)

可能是个大赢家......