東方博宜OJ1972: 【入門】素數字母題解
阿新 • • 發佈:2021-08-03
題目傳送門
基礎題,此題有\(3\)種解法
我不會尤拉篩
\(O(52n):\)
列舉\(2\sim n\div2\),判斷是否x%i==0
即可。
\(Code:\)
#include<iostream> #include<cstring> #include<cmath> using namespace std; bool ispro(int x){ for(int i=2;i<=x/2;i++){ if(x%i==0){ return 0; } } return 1; } int main(){ for(int i=65;i<=90;i++){ if(ispro(i)){ cout<<i<<" "<<char(i)<<endl; } } for(int i=97;i<=122;i++){ if(ispro(i)){ cout<<i<<" "<<char(i)<<endl; } } return 0; }
\(O(52\sqrt n):\)
觀察發現如果\(n\bmod i=0\),則\(n\bmod (n\div i)=0\)
所以可以只從\(2\)列舉到\(\sqrt n\)
\(Code:\)
#include<iostream> #include<cstring> #include<cmath> using namespace std; bool ispro(int x){ for(int i=2;i<=sqrt(x);i++){ if(x%i==0){ return 0; } } return 1; } int main(){ for(int i=65;i<=90;i++){ if(ispro(i)){ cout<<i<<" "<<char(i)<<endl; } } for(int i=97;i<=122;i++){ if(ispro(i)){ cout<<i<<" "<<char(i)<<endl; } } return 0; }
\(O(366):\)
可以用埃式篩解決。
核心:列舉\(2\sim n\),如果之前沒標記它,則標記\(i+i\sim n\)的\(i\)的倍數。
\(Code:\)
#include<iostream> using namespace std; int a[131]; #include<iostream> using namespace std; int a[131]; void shai(int n){ a[0]=a[1]=1; for(int i=2;i<=n;i++){ if(a[i]==0){ for(int j=i*2;j<=n;j+=i){ a[j]=1; } } } } int main(){ shai(122); for(int i=65;i<=90;i++){ if(!a[i]){ cout<<i<<" "<<char(i)<<endl; } } for(int i=97;i<=122;i++){ if(!a[i]){ cout<<i<<" "<<char(i)<<endl; } } return 0; }