1013 数素数

令 Pi​ 表示第 i 个素数。现任给两个正整数 M≤N≤104,请输出 PM​ 到 PN​ 的所有素数。

输入格式:

输入在一行中给出 M 和 N,其间以空格分隔。

输出格式:

输出从 PM​ 到 PN​ 的所有素数,每 10 个数字占 1 行,其间以空格分隔,但行末不得有多余空格。

输入样例:

5 27

输出样例:

11 13 17 19 23 29 31 37 41 43
47 53 59 61 67 71 73 79 83 89
97 101 103

/*
本题可直接暴力求解,题目最大测试数据
M=1,N=10000时,每一个素数都要查找。
暂时没有找到优化的方法,不如暴力求解10000
个素数放进数组,输出时按照下标进行输出。
输出第n个数的时候直接通过下标操作,比较方便;
*/
#include<iostream>
#include<cmath>
using namespace std;
//判断n是否是素数;0表示不是素数;
int prime(int n){
    int max=(int)sqrt((double)n);    //max作为最大因子的边界;
    int i;                //这里如果n为非素数,那么在max之前一定能找到一个因子;
    int ret=0;        //返回值为0表示为非素数;
    for(i=2;i<=max;i++){
        if(n%i==0)
        {break;}
    }
    if((i>max&&max!=1)||n==2||n==3)    //这里2和3的max都是1,不会进入循环;
    {ret=1;}
    return ret;
}
int main(){
    int Prime[10000];    //存放素数;
    int count=0;    //记录素数个数;
    int n=1;    //作为自然数增加;
    while(count<10000){
        if(prime(n)==1){
            Prime[count]=n;
            count++;
        }
        n++;
    }
    //输入M和N;
    int M,N;
    cin>>M>>N;
    //输出素数;
    int flag=0;    //换行标志;
    for(int i=M-1;i<N;i++){    //注意数组下标从0开始,所以这里是从M-1开始而不是M开始;
        flag++;    //对每行输出个数进行计数;
        if(flag%10==0){    //第10个则换行;
            cout<<Prime[i]<<endl;
        }
        else{
            cout<<Prime[i];
            if(i<N-1){
                cout<<" ";    //行末无空格,单独输出;
            }
        }
    }
    return 0;
}
/*
解题反思:
还是素数的老规矩,因子的边界(int)sqrt((double)x);是算术平方根;
然后这里考虑到N最大为10的4次方时,每一个素数都数出来,不如直接就
全部求出来,绝对不会超时,因为当取最大N时也是每个数都要数出来;
*/

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值