一位朋友给了我这段代码,以便找到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)而不是我?
感谢。
答案 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,...整除,直到您要查找的数字的一半。如果数字可以被任何数字整除,而不留下余数,则数字不是素数。一旦达到该数字值的一半,您需要检查其余数字。