素数又称质数,有无限个。一个大于1的自然数,除了1和它本身外,不能被其他自然数整除,换句话说就是该数除了1和它本身以外不再有其他的因数;否则称为合数。
#include<stdio.h>
int Sushu(int a);
int main()
{
int n = 0, res = 0;
for (n = 100; n < 200; n++)
{
res = Sushu(n);
if (res == 1)
printf("%4d", n);
}
system("pause");
return 0;
}
int Sushu(int a)
{
int i = 0;
for (i = 2; i < a; i++)
{
if (a % i == 0)
return 0; //如果不是素数返回0
}
return 1; //如果是素数返回1
}
此时,素数判断函数里的循环条件i是从2到a,即这个数本身,显然这是没有必要的。因为要判断这个数是不是素数根本不用这么大范围的循环条件,可以一步步的缩小循环条件的范围,使程序更高效。
我们知道如果一个数a不是素数,那么它一定可以看成是a/2之前的某个数的倍数,那么循环条件i的范围可以缩小为2到a/2。
for (i = 2; i < a / 2; i++)
{
if (a % i == 0)
return 0;
}
此时的程序效率要比之前的快一倍。然而我们还可以进一步提高它的效率。
因为如果一个数不是素数是合数, 那么一定可以由两个自然数相乘得到, 其中一个大于或等于它的平方根,一个小于或等于它的平方根。并且成对出现。那么这时循环条件i的范围可以缩小为2到sqrt(a),值得注意的是这里一定要包括sqrt(a),要不然计算结果会有遗漏。
for (i = 2; i <=sqrt(a); i++)
{
if (a % i == 0)
return 0;
}
在这里调用了库函数sqrt()来计算a的开方值,所以头文件要包含这个函数的库#include<math.h>。