1. 程式人生 > 其它 >東方博宜OJ1972: 【入門】素數字母題解

東方博宜OJ1972: 【入門】素數字母題解

題目傳送門
基礎題,此題有\(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;
}