判定一个数是否为素数(只能被1和本身整除)通常用小于这个数的所有数去试除他,看是否能被整除,显然不够简便。
优化:
-
除了2以外,其他偶数全都不为素数(能被2整除),所以除了2以外只需要判断奇数是否为素数
-
若要判断一个数n,不需要试除到n-1或者n/2,只需要到sqrt(n),
因为一个数若有因数,一个大于sqrt(n)一个小于sqrt(n)或者两者都为sqrt(n) -
一个数的独特因数一定为素数,可以将之前算出的素数保存,用于之后的判断
(1.3优化平级)
代码实现(只给出了函数,未写主函数):
优化:1.2
用于判断一个数是否为素数
int isprime(int n)
{
int i = 0, end = sqrt(n);
if( n == 2)
return 1;
if(n % 2 == 0)
return 0;
for(i = 3; i <= end; i += 2)
{
if(n % i == 0)
return 0;
}
return 1;
}
优化:1.2.3
用于输出n以内的所有素数
需要在顺序遍历,将每个找到的素数存到数组内
int arr[max]={2,3,5};
int func(int n)
{
int j, m = 3, i = 2, end;
for( ; ; )
{
m += 2; //2是素数,偶数都是非素数,奇数加2仍为奇数
end = sqrt(m);
for(j = 1; arr[j] <= end; j++)
{
if(m % arr[j] == 0)
break;
}
if(end < arr[j])
{
arr[i++] = m;
}
if(fabs(m-n) <= 1)
break;
}
for(j = 0; j < i ; j++)
printf("%d ", arr[j]);
}