suxxsfe

一言(ヒトコト)

东方博宜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];
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;
} 
posted @ 2021-08-03 17:25  卫道士qwq  阅读(768)  评论(0编辑  收藏  举报