OI教程——第一单元·质数·小素数的判定

日出江花红胜火,哪有那么多如果~大家好,这里是OI自制小教程的第一单元第一课!!!

                            ~~~~~~~~~~~~~~~~~~~~~质数~~~~~~~~~~~~~~~~~~~~~

                ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​  BGM,起动!

素数的定义为只能被1和自己整除的正整数。

于是我们想到:怎么判断质数呢?

故事载入中……

A:B,我问你,2是不是质数?

B:简单,肯定是。

A:那31呢?

B:也很简单啊,是的。

A:97咧?

B:额……不是?啊呸!97是质数!

……………………………………(若干个问题)

A:那71158947752306818727434429369188556401240828444068165180655794647869341793007648944665105500929069331460123658022998121848069682800269216990813322982111923668596143083266417786447985614999705990927279461750231279033086139646399090654523708172267446445736297452647531545072871109131100526458578868371465792525168886856364922461526822896638234048008896354043884510180386986892504658787734681115654045581302250488266626239943746951238120320236812541729268680585981421252340857809092057368774263019597651呢?

B的头顶冒出了黑烟……

让我们来帮助一下小B吧!

·第一课——小素数的判定

OI玄黄通天彻古今大帝暴力美学到!!!

 根据素数的定义,我们可以得到“试除法”。

bool is_prime (long long n)
{
  if(n<=1) return false;//1不是素数 
  int t=sqrt(n);//见文章
  for(int i=2;i<=t;i++)
  {
    if(n%i==0) return false;//有其他约数,不是素数 
  }
  return true;//是素数
}

注意,

int t=sqrt(n);

这行代码可能有很多小OIer觉得可以写成:

i*i<=n

以及

i<=n/i

这两种写法呢,我只能说,

垃圾

i*i不仅可能让人见人爱,花见花开的int类型……

BOOM!!!!!!!!!!!!!!!!!!

还会让代码时间变得……

。。。。。。。。。(漫长)

至于i<=n/i,会出现同样的问题(TLE快乐!)

(原因:在每次for时,都会重新计算一遍i*i或者n/i,导致加长代码时间)

好的,那么代码时间复杂度就是sqrt(n),可以应付n<=1e12的问题。

下班!!!(作业:如果n>1e12,该怎么办?)

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值