今天通过试除法解决一下素数的求解问题,数值选取的是100到300的数字。
第一阶层:一个一个的来计算,从2试除到n-1,代码如下:
#include<stdio.h>
int main()
{
int i = 100;
int count = 0;
int j = 0;
for (i = 100; i <= 300; i++)//
{
for (j = 2; j < i; j++)
{
if (i%j == 0)
{
break;
}
}
//不是素数就跳出循环
if (i == j)//是素数
{
printf("%d ", i);
count++;
}
}
printf("\ncount=%d\n", count);
return 0;
}
运行结果:
第二阶层:考虑到上述程序过于麻烦,事实上,我们进行试除法并不需要从2试除到n-1,只需要试除到n的算术平方根即可,我们修改一下程序的内层for循环:
#include<stdio.h>
#include<math.h>
int main()
{
int i = 0;
int k = 0;
int count = 0;
for (i = 100; i <= 300; i++)
{
for (k = 2; k <= sqrt(i); k++)
{
if (i%k == 0)//非素数,跳出循环
{
break;
}
}
if (k>sqrt(i))
{
printf("%d ", i);
count++;
}
}
printf("\ncount=%d\n", count);
return 0;
}
第三阶层:100到300之间的偶数不可能是素数,从这个角度出发,可以再对算法进行优化,这次是修改外层for循环:
#include<stdio.h>
#include<math.h>
int main()
{
int i = 0;
int k = 0;
int count = 0;
for (i = 101; i <= 300; i+=2)
{
for (k = 2; k <= sqrt(i); k++)
{
if (i%k == 0)//非素数,跳出循环
{
break;
}
}
if (k>sqrt(i))
{
printf("%d ", i);
count++;
}
}
printf("\ncount=%d\n", count);
return 0;
}
好了,今天把试除法求解素数问题展示了一下,之所以没有在最开始的时候就把目前我知道的最优解放在开头,而是把全部的程序都放了出来,是想提醒自己,也提醒大家,算法是有优化空间的,特别是针对初学者,码的很多程序都可以再进行优化,拿循环来说,循环变量的优化就是非常重要的,在平时写程序的时候要记得多思考,不要止步于当前的最优解。
除了试除法,还有其他的素数求解算法,以后再继续展示。