日出江花红胜火,哪有那么多如果~大家好,这里是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,该怎么办?)