关于素数判定、素数的筛选即优化

我们都知道素数就是只能被自身和1整除的数,当然0和1 除外;

为了判断一个数n是不是素数我们可以让n依次整除【2,n-1】区间的数,只要有一个能被n整除,则n不是素数。

代码如下:

int flag=0;
for(int i=2;i<n;i++){
    if(n%i==0) flag=1;
}
if(flag) printf("不是");
else printf("是");

然而我们知道一个数的由两个数相乘得到时,一个数增大则另一个减小,所以只需要判断到i*i<n即可

int flag=0;
for(int i=2;i*i<n;i++){
    if(n%i==0) flag=1;
}
if(flag) printf("不是");
else printf("是");

这增加了时间效率,但有一个一直没有解决的问题:n可能很大,i*i很可能溢出,我们要尽可能安全的计算,有的小机灵可能想到了,平方太大我们可以开方啊,You are right。

但是开放仍然有一个潜在的问题,sqrt函数参数是浮点类型的,浮点数在计算机中的运算是有误差的,所以这里用到了floor函数,他返回不超过参数的最大整数。

代码如下:

int flag=0;
for(int i=2;i<floor(sqrt(n)+0.5);i++){
	if(n%i==0) flag=1;
} 
if(flag) printf("不是");
else printf("是"); 
floor(sqrt(n)+0.5)//经常用来减少浮点数误差
这样我们知道怎样判断素数了,接下来让我们看看怎么求【0,1000000】之间的所有素数吧。


转载于:https://www.cnblogs.com/RenoStudio/p/10355232.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值