PAT乙级(Basic Level)真题 1003.数素数

题目地址


http://www.nowcoder.com/pat/6/problem/4079


解题思路——埃拉托斯特尼筛法


筛法思想:素数的倍数一定不是素数

代码思路:开2个数组,分别存放{筛出来的素数}、{2.3.5.7.11...最大可能的素数}。先设所有的数都是素数,然后从2开始,逐个排除该素数的所有倍数,剩下的数就是素数,存入素数数组。


思路来源:Shura


AC代码如下:

#include <iostream>
#include <stdio.h>
#include <string.h>

using namespace std;

const int M = 10001;
const int N = 104730;//第10000个素数是104729
int prime[M];
int number[N];

int main()
{
    int m,n;
    scanf("%d%d",&m,&n);

    memset(number,1,sizeof(number));//设2~N全都是素数

    int tot=0;
    for( int i=2;i<=N;++i ){
        if( number[i]==1 ){//将第一个数(2)和没有被排除的数存入素数数组
            prime[tot++] = i;
        }
        for( int j=2*i;j<=N;j+=i ){//排除素数i的所有倍数
            number[j] = 0;
        }
    }

    int printed=0,isfirst=1;
    for( int i=m-1;i<n;++i ){
        if( isfirst ){
            printf("%d",prime[i]);
            isfirst=0;
            ++printed;
        }
        else{
            printf(" %d",prime[i]);
            ++printed;
        }

        if( printed%10==0 ){//打印,满十换行
            printf("\n");
            isfirst=1;
        }
    }

    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Coder Ben

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值