S-1106-素数检测 加 素数筛选法求一块区间所有素数

基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题 
给出N个正整数,检测每个数是否为质数。如果是,输出"Yes",否则输出"No"。
Input
第1行:一个数N,表示正整数的数量。(1 <= N <= 1000)
第2 - N + 1行:每行1个数(2 <= S[i] <= 10^9)
Output
输出共N行,每行为 Yes 或 No。
Input示例

5
2
3
4
5
6

Output示例

Yes
Yes
No
Yes
No

较暴力算法思路:

(1)从2开始,2是最小的质数。

(2)除了2之外的偶数全都不是质数,因为除了1和自身之外它们还能被2整除。若为大于2的奇数,则进入下一步继续判断。

(3)将其开方,若从3到开方向下取整之间的所有奇数都不能将其整除,则说明该数为质数。

 

至于为什么只用除到其平方根?

 

#include<stdio.h>
#include <iostream>
#include<cmath>
using namespace std;
const int maxn=1e9+7;
int ispes(int n){
    if(n<2) return false;
    if(n==2) return true;
    if(n%2 == 0) return false;
    for(int i=3;i*i<=n;i++){
        if(n%i==0)
        return false;
    }
    return true;
}
int main(){
    int num;
    int t;
    cin>>t;
    //FilterPrime();
    while(t--){
        cin>>num;
        if(ispes(num))cout<<"Yes"<<endl;
        else cout<<"No"<<endl;
    }
    return 0;
}

素数筛选法

 

思路:

我们知道要求某一区间内的素数,只需要将这一区间内的合数去除,即筛除即可,这种办法利用的就是这种思想。

第一遍筛掉2的倍数:剩下2,3,5,7,9,11,13,15.....

第二遍筛掉3的倍数:剩下2,3,5,7,11,13,....

第三遍筛掉5的倍数:(为什么是5而不是4,因为4已经被2的倍数筛掉了,再筛已经无意义)

第四遍筛掉7的倍数:(为什么是7而不是6,同理因为6已经被之前的2,3筛掉了再筛也没有意义了)

以此类推.......................

代码:


#include<iostream>
#include<string>
using namespace std;
const int maxn=50005;
const int N = 50000;
int Prime[maxn]; //保存素数
bool isPrime[maxn];//标记该位是否是素数
int len;
//fin [2,N] 's prime
void SetPrime()
{
    int i,j;
    len = 0;
    for(int i=2;i<=maxn;i++)isPrime[i]=true;
    for(i=2; i<=N; ++i)
    {
        if(isPrime[i])
        {
            Prime[len++] = i;
            for(j=i+i; j<=N; j += i)
                isPrime[j] = false;
        }
    }
}
int main()
{
    SetPrime();
    int i;
    for(i=1; i<len; ++i)
        cout << Prime[i] <<' ';
    cout << endl;
    return 0;
}

优化的线性筛


#include<stdio.h>
#include<cstring>
#include<bits/stdc++.h>
using namespace std;
const int MAX=1e7+7;//求MAX范围内的素数
long long su[MAX],cnt;
bool isprime[MAX];
void prime()
{
    cnt=1;
    memset(isprime,1,sizeof(isprime));//初始化认为所有数都为素数
    isprime[0]=isprime[1]=0;//0和1不是素数
    for(long long i=2;i<=MAX;i++)
    {
        if(isprime[i])
            su[cnt++]=i;//保存素数i
        for(long long j=1;j<cnt&&su[j]*i<MAX;j++)
        {
            isprime[su[j]*i]=0;//筛掉小于等于i的素数和i的积构成的合数
        }
    }
}
int main()
{
    prime();
    //for(long long i=1;i<cnt;i++)
     //   printf("%d  ",su[i]);
    return 0;
}

 

 

全部评论

相关推荐

繁华的街道两旁,湿漉漉的下午,两个青涩的脸庞互相张望。宽大卫衣下娇小的她,向我奔来。不约而同的卫衣,斯文的半框眼镜掩饰着一个穷臭屌丝气息。这是我和我牛爱网第一死忠粉兼专属女嘉宾最初的见面。火速恋爱,但是没有所谓的快节奏,相识半年,还是一样的热恋。吃着肉夹馍坐过西安的小三轮洱海边自行车的气球胖吃着她最喜欢的酸酸水果和小乳扇在南山某店爷爷穿孙子衣服,摸肥猫就算我在忙也要抽出时间陪她去吃他喜欢的漂亮饭生活总是平凡,但平凡不平淡还记得见面第一件事儿:“我去上个厕所。”现在早上第一件事儿:“拉*”第一次上我车的她:“我可以坐副驾吗?”现在的她:“老子把jio翘到上面得得挡到你后视镜。”这小孩,虽然花了我...
Stan_蹒跚者:确很厉害,但是有一个小问题:谁问你了?我的意思是,谁在意?我告诉你,根本没人问你,在我们之中0人问了你,我把所有问你的人都请来 party 了,到场人数是0个人,誰问你了?WHO ASKED?谁问汝矣?誰があなたに聞きましたか?누가 물어봤어?我爬上了珠穆朗玛峰也没找到谁问你了,我刚刚潜入了世界上最大的射电望远镜也没开到那个问你的人的盒,在找到谁问你之前我连癌症的解药都发明了出来,我开了最大距离渲染也没找到谁问你了我活在这个被辐射蹂躏了多年的破碎世界的坟墓里目睹全球核战争把人类文明毁灭也没见到谁问你了
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
03-29 08:32
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务