目录
前言
一、什么是质数(素数)
质数:
二、求素数的几种方法
1.遍历
2.优化1:减少遍历的长度
3 .优化2:剔除偶数
4.利用平方根函数
5.剔除法
三.总结
代码能力,能从对一个代码的不断优化中提高,在求素数代码的一次次优化中,提高自己的代码能力。以打印100-200间的素数为例子
质数是指在大于1的自然数中,除了1和它本身以外不再有其他因数的自然数,也称为素数
例如:2,3,5,7,11,13,17,19,23...........
不难看出 ,素数除了2之外 都是奇数...
求素数的基本思想就是不断试除,对这个区间内的所有数进行遍历,而最常用的遍历方法就是利用for循环;
思路:定义三个int变量:i,j,flag=0
②最外层定义一个for循环,确定被除数i的范围区间100~200
③下面再嵌套一层for循环,确定除数j的区间,j应该从2开始,直到等于i
④写一个if判断语句,利用取余公式i%j来确定其余数是否为0:若为0,就说明i可以整除j,则退出循环;
#include
int main()
{
int i, j;
int flag = 0;
int count1 = 0;
int count2 = 0;
for (i = 100; i <= 200; i++)
{
for (j = 2; j <= i; j++)
{
if (i % j == 0)
{
break;
}
count1++;
}
count2++;
if (i == j)
printf("%d ", i);
}
printf("\n内层count=%d", count1);
printf("\n外层count=%d", count2);
return 0;
}
定义了一个count来计算循环的次数内层 count=3212 外层count101
代码如下:
#include
int main()
{
int i, j;
int flag = 0;
int count1 = 0;
int count2 = 0;
for (i = 100; i <= 200; i++)
{
for (j = 2; j <= (i / 2); j++)
{
if (i % j == 0)
{
break;
}
count1++;
}
count2++;
if (j >= i / 2)
printf("%d ", i);
}
printf("\n内层count=%d", count1);
printf("\n外层count=%d", count2);
return 0;
}
我们发现所有的除了2之外的所有偶数都不是素数
#include
int main()
{
int i, j;
int flag = 0;
int count1=0;
int count2 = 0;
for (i = 101; i <=200; i+=2)
{
for (j = 2; j <=i; j++)
{
if (i % j == 0)
{
break;
}
count1++;
}
count2++;
if (j>=i/2)
printf("%d ", i);
}
printf("\n内层count=%d", count1);
printf("\n外层count=%d", count2);
return 0;
}
100 可以用 1 * 100 2 * 50 4 * 25 5 * 20 * 10 * 10表示,肯定会有细心的小伙伴发现
每个式子中总会有一个数小于等于100开平方,所以才有了这种方法
#include
#include
int main()
{
int i, j;
int flag = 0;
int count1 = 0;
int count2 = 0;
for (i = 100; i <= 200; i++)
{
for (j = 2; j <= sqrt(i); j++)
{
if (i % j == 0)
{
break;
}
count1++;
}
count2++;
if (sqrt(i) <= j)
printf("%d ", i);
}
printf("\n内层count=%d", count1);
printf("\n外层count=%d", count2);
return 0;
}
可以看到相较于前几种方法,这一方法内层运行次数大大减少!!!
首先除了2之外质数均为奇数,其次前面所求的质数的倍数不再为质数
由此诞生了剔除法;顾名思义,就是将偶数,质数的整数倍剔除出去!
#include
int main()
{
int i = 0;
int count = 0;
for (i = 101; i < 200; i += 2)
{
if (i % 2 != 0 && i % 3 != 0 && i % 5 != 0 && i % 7 != 0 && i % 11 != 0 && i % 13 != 0)
{
printf("%d ", i);
}
count++;
}
printf("\ncount=%d\n", count);
return 0;
}
运行次数很少!!!较为便捷
在一次次优化中,代码不断改进,效率不断提升,自身能力也如同这代码的优化一般,越来越完美,试问自己 还可以优化多少呢?