C编程 - 查找素数

时间:2014-02-27 07:33:51

标签: c++ c numbers

一位朋友给了我这段代码,以便找到1-40

的素数
#include <stdio.h>
#include <conio.h>

void main(void)
{
    clrscr();

//print prime numbers from 1-40

int i, j;
int factor = 0; //this will be 1 if a factor is found
        //otherwise 0
        //so factor = 1 means not a prime number

printf("Prime numbers from 1 to 40 are: ");
for (i = 1; i < 41; i++)
{
    for (j = 2; j <= (i / 2); j++)
    {
        if (factor == 0)
        {
            if (i % j == 0)
                factor = 1;
            else
                factor = 0;
        }
    }
    if (factor != 1)
    {
        printf("%d ", i);
    }
    factor = 0;
}
getch();

}

我没有得到循环的第二部分..为什么j从2开始,为什么它小于(i / 2)而不是我?

感谢。

4 个答案:

答案 0 :(得分:3)

  

为什么j以2开头

因为1是所有数字(包括素数)的一个因子,所以你不测试它。 (外部循环也应该从2开始,因为按照惯例,1通常不被认为是素数。)

  

为什么它低于(i / 2)而不是i

没有必要检查大于i的平方根的因子,因为如果有这样的因子f,也会有一个较小的因子i/f比平方根。

但是平方根很难计算,所以这个版本使用i/2作为一个更简单但更宽松的上限。只要i至少为4,它至少与平方根一样大。

答案 1 :(得分:1)

从2开始,因为2是最小的素数(1不被认为是素数)并且以i / 2结束,因为数字n的最大因子最多为n/2

如果它从1开始,你将找不到任何素数,因为每个数字都可以被1整除。

至于第二部分,我将使用矛盾证明。假设n可以被大于m的数字n/2整除。那么n也可以被n/m整除,但是m>n/2 implies 2 * m> N which means that n must be divisible by an integer less than 2, but the only such integer is 1, which would imply that M = 1`。因此n在n / 2和n之间不能有除数。

答案 2 :(得分:1)

why does j start with 2

What is prime number?
A prime number (or a prime) is a natural number greater than 1 that has no positive divisors other than 1 and itself. 

请注意关键字other than one

and why is it less than (i / 2) and not i?

素数有一条规则“如果数字不能被sqrt加倍,那么它就是素数”。 所以检查这个数字加倍的sqrt。

点击此处查看更多优化

PRIME NUMBER PROGRAM FOR LARGE NUMBERS WITH 6 EFFICIENCY METHOD HANDLED

答案 3 :(得分:0)

您需要开始查找给定的数字是否可以被2,3,...整除,直到您要查找的数字的一半。如果数字可以被任何数字整除,而不留下余数,则数字不是素数。一旦达到该数字值的一半,您需要检查其余数字。