1013数素数

  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

C语言版:

#include<stdio.h>  
#include<math.h>  
int scnprim(int n);  
  
  
int main()  
{     
    int i,m,n,count=0;  
    scanf("%d %d",&m,&n);  
  
    for(i=2;;i++)  
    {  
        if(scnprim(i))  
        {  
            count++;  
            if(m<=count&&n>=count)  
            {   if((count-m+1)%10==0)  
                printf("%d\n",i);  
                else if(count!=n)  
                printf("%d ",i);  
                else  
                printf("%d",i);  
            }  
        }  
        if(n<count)  
        {  
            break;  
        }  
    }  
    return 0;  
}  
  
  
  
int scnprim(int n)//筛选素数  
{  
    int sqrtc,j;  
    sqrtc=(int)sqrt(n);  
    for(j=2;j<=sqrtc;j++)  
    {  
        if(n%j==0)  
            return 0;  
  
    }  
    return n;  
} 

C++版本

#include<iostream>  
#include<math.h>  
#include<vector>  
using namespace std;  
bool isPrimer(int n){  
    for(int i=2;i<(int)sqrt(n)+1;i++){  
        if(n%i == 0){  
            return false;  
        }  
    }  
    return true;  
}  
int main(){  
    vector<int>vec;  
    for(int i =2;i < 110000;i++){  
        if(isPrimer(i)){  
            vec.push_back(i);  
        }  
    }  
    for(int n,m;cin>>n>>m;){  
        int count = 0;  
        for(int i = n-1;i<m;i++){  
            count++;  
            cout<<vec[i];  
            if(i+1 == m){  
                cout<<endl;  
            }else{  
                if(count == 10){  
                    cout<<endl;  
                    count = 0;  
                }else{  
                    cout<<" ";  
                }     
            }  
              
        }  
    }  
    return 0;  
}  


C++second version

#include <cstdio>
#include <iostream>
#include <cstring>
#include <cmath>
using namespace std;

#define NUM 10004
int primes[NUM];

void findPrimes(){
    
    //如果不能被任何一个质数整除,那就是质数
    int cnt=0;// 第cnt个质数,从1开始计数
    int a = 2;// 从2开始的自然数 a
    while (cnt <= NUM) {
        // 优化1:排除偶数
        if (a % 2 == 0 && a != 2) {
            ++a;
            continue;
        }

        int i = 0;
        // 优化2:不超过第cnt个质数的开方数
        for (i = 0; i < sqrt(cnt); ++i) {
            if (a % primes[i] == 0) {
                break;
            }
        }
        if (i >= sqrt(cnt)) {
            primes[cnt] = a;
            cnt++;

        }
        ++a;
    }
    
}
int main(){
    
    // 预处理
    findPrimes();
    
    // 输入数据
    int m,n;
    cin >> m >> n;
    
    // 按格式输出
    for(int i = m; i <= n; ++i){
        
        cout << primes[i-1];
        
        if ((i-m+1) % 10 == 0 || i == n) {
//          cout << endl;
            printf("\n");
        }else{
//          cout << ' ';
            printf(" ");
        }
        
    }
}

C++Third version

#include<iostream>  
#include<math.h>  
using namespace std;  
int main()  
{  
    int n=1,M,N,i=0;  
    int count=0,num=0;  
    cin>>M>>N;  
    while(++n)  
    {  
        for(i=2;i<=int(sqrt(n*0.1*10.0));i++)  
        {  
            if(n%i==0)  
                break;  
        }  
        i=i-1;//注意for循环后面的i++,因此此处要减一  
        if(i==int(sqrt(n*0.1*10.0)))  
        {  
            count++;  
            if(count>=M&&count<=N)  
            {  
                num=num+1;  
                cout<<n;  
                if(num<10&&count!=N)  
                    cout<<' ';  
                else  
                {  
                    num=0;  
                    cout<<endl;  
                }  
            }     
        }  
        if(count>N)  
            break;  
    }  
          
}  


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值