title: 筛选法求素数
date: 2021-11-20 17:03:07
tags: C语言
前言
期末考试结束了,打算重拾之前的C语言,结果在数组那个地方的第一道题就将我卡住了。自信心受挫不少,不过还好看过答案之后还算是比较好理解的。
筛选法求素数
所谓筛选法就是“埃拉托色尼筛选法”。具体的算法步骤如下:
(1)挖掉1;
(2)用下一个为被挖掉的数p除后面的各数,把p的倍数挖掉
(3)检查p是否小于\(\sqrt{n})的整数部分,如果是则返回(2)继续执行,否则就结束。
(4)剩下的书就是素数。
根据算法可以编写程序如下:
//用筛选法排序求100以内的素数
#include <stdio.h>
#include <math.h>
int main()
{
int a[100];
//先给数组赋值
for (int i = 0;i <= 99;i++)
{
a[i] = i+1;
}
a[0] = 0;
//采用筛选法来找素数。
for (int i = 1;i < sqrt(100);i++)
{
for (int j = i + 1;j < 100;j++)
{
if(a[i]!=0&&a[j]!=0)
if (a[j] % a[i] == 0)
a[j] = 0;
}
}
for (int i = 0;i <= 99;i++)
{
if(a[i]!=0)
printf("%d\n", a[i]);
}
}
这里调试的时候遇见一个问题如下图所示:
这里我是一开始没有将if(a[i]!=0&&a[j]!=0)的判断语句加入进去,便会跳出上述错误。查阅后解释为在进行division by zero "除数是0"导致的错误:
解决方法1:运行前判断 如果除数为0,则不要计算
解决方法2:使用@符号 屏蔽掉错误。
上述解决办法就是运行前进行判断除数是否为零。
总结
求素数的方法有很多,这里循环一般最高到\(\sqrt{n})在网上找到比较好理解的解释:
一个数不是质数那么它是两个数的乘积
n=sqrt(n)sqrt(n)
比sqrt(n)大的数我们设为x,再设n=xy
则y一定比sqrt(n)小
则我们是从1开始验证到sqrt(n)
这个比sqrt(n)小的y肯定被验证到了
故只需验证到sqrt(n)