筛选法求素数


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=x
y
则y一定比sqrt(n)小
则我们是从1开始验证到sqrt(n)
这个比sqrt(n)小的y肯定被验证到了
故只需验证到sqrt(n)

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值