一般思路:遍历100~200间每个数,并对每个数判断2~其本身-1之中,是否存在能够该数整除的因子,若有,则这个数不是素数,否则这个数是素数。
代码如下:
#include <stdio.h>
int main()
{
int i=100;
for(i=100;i<=200;i++)
{
int j;
for(j=2;j<i;j++)
{
if(i%j==0)
{
break;
}
if(j==i-1)
{
printf("%d ",i);
}
}
}
return 0;
}
优化方案:
1.因为一个数若不是素数,则这个数可以拆解为a*b,而其中假设a较小,a的最小值为2,也就是说b的最大值为这个数的1/2,因此对于上述方案可以进行优化,使j只需要到i/2即可。
代码如下:
#include <stdio.h>
int main()
{
int i=100;
for(i=100;i<=200;i++)
{
int j;
for(j=2;j<=i/2;j++)
{
if(i%j==0)
{
break;
}
if(j==i/2)
{
printf("%d ",i);
}
}
}
return 0;
}
2.因为偶数可以拆解成2*x,因此偶数绝不会是素数
代码如下:
#include <stdio.h>
int main()
{
int i=100;
for(i=101;i<=200;i+=2)
{
int j;
for(j=2;j<=i/2;j++)
{
if(i%j==0)
{
break;
}
if(j==i/2)
{
printf("%d ",i);
}
}
}
return 0;
}
3.因为一个数可以拆解为a*b,设a是较小的那个数,则a的最大值不过是i的开平方,在第1种方法的基础上可以将j 的范围进一步缩小,j只需遍历至sqrt(i)即可
代码如下:
#include <stdio.h>
#include <math.h>
int main()
{
int i = 101;
for (; i <= 200; i+=2 ){
int j = 2;
for (; j <= sqrt(i); j++){
if ( i % j == 0 ){
break;
}
}
if (j > sqrt(i)){
printf("%d ", i);
}
}
return 0;
}
这种方法是所有方案中最优,可以减少遍历的时间。