判断一个质数的代码是不是很好写?
今天我们来把他优化一下。
未优化
#include <iostream>
using namespace std;
bool IsPrime(int n)
{
if(n == 1){
cout<<n<<"NO"<<endl;
return false;
}
for (int i = 2; i < n; i++)
{
if ((n % i) == 0){
cout<<n<<"NO"<<endl;
return false;
}
}
cout<<n<<"YES"<<endl;
return true;
}
这里的代码有一个for循环,时间复杂度为O(n)。
很显然,这个算法并不让人满意,效率不高。
接下来,就是广为人知的平方根优化
平方根优化
#include <iostream>
using namespace std;
bool IsPrime(int n)
{
if(n == 1){
cout<<n<<"NO"<<endl;
return false;
}
for (int i = 2; i * i <= n; i++) // 计算到这里就可以了
{
if ((n % i) == 0){
cout<<n<<"NO"<<endl;
return false;
}
}
cout<<n<<"YES"<<endl;
return true;
}
我们把一个数分解质因数,其中最大的质数不超过。
假设有一个数大于,那么就相当于是
,就和前面的重复了,就没必要再试了。
236优化
#include <iostream>
using namespace std;
bool IsPrime(int n)
{
if(n == 1){
cout<<n<<"NO"<<endl;
return false;
}
if((n % 2) == 0 || (n * 3) == 0) {
cout<<n<<"No"<<endl; //开头优化
return false;
}
for (int i = 2; i * i <= n; i += 6)
{
if ((n % i) == 0 || ((n % (i + 2)) == 0){ //运用公式
cout<<n<<"NO"<<endl;
return false;
}
}
cout<<n<<"YES"<<endl;
return true;
}
第一步,先把2和3的倍数划去。
第二部分看不懂没关系,网上一搜就知道了。
总结
我们成功的把时间复杂度从降到了
byebye~