数学问题_素数筛法

关于数学的胡言乱语 2018-02-07

例4.6 素数判定 (1047)

题目描述:给定一个数n,要求判断其是否为素数(0,1,负数都是非素数)。
输入:测试数据有多组,每组输入一个数n。
输出:对于每组输入,若是素数则输出yes,否则输入no。
样例输入:
13
样例输出:
yes
#include<stdio.h>
#include<math.h>
using namespace std;
bool judge(int x){
    if(x<=) return false;
    int bound=(int)sqrt(x)+;
    for(int i=;i<bound;i++){
        if(x%i==)
            return false;
    }
    return true;
}
int main(){
    int x;
    while(scanf("%d",&x)!=EOF){
        puts(judge(x)?"yes":"no");
    }
    return ;
}

例4.7 素数 (1163)

题目描述:输入一个整数n(2<=n<=10000),要求输出所有从1到这个整数之间(不包括1和这个整数)个位为1的素数,如果没有则输出-1。
输入:输入有多组数据。每组一行,输入n。
输出:输出所有从1到这个整数之间(不包括1和这个整数)个位为1的素数(素数之间用空格隔开,最后一个素数后面没有空格),如果没有则输出-1。
样例输入:
100
样例输出:
11 31 41 61 71
#include<stdio.h>
int prime[10000];
bool mark[10001];
int primeSize;
void init(){
    for(int i=2;i<=10000;i++)
        mark[i]=false;
    primeSize=0;
    for(int i=2;i<=10000;i++){
        if(mark[i]==true) continue;
        prime[primeSize++]=i;
        for(int j=i*i;j<=10000;j+=i){//因为i*k(k<i)必被k标记过 
            mark[j]=true;
        }
    }
}
int main(){
    init();
    int n;
    while(scanf("%d",&n)!=EOF){
        bool isOutput=false;//表示是否有过输出,第一个输出的数字以外均需在输出前附加一个空格 
        for(int i=0;i<primeSize;i++){
            if(prime[i]<n&&prime[i]%10==1){
                if(!isOutput){
                    isOutput=true;
                    printf("%d",prime[i]);
                }
                else
                    printf(" %d",prime[i]);
            }
        }
        if(!isOutput) printf("-1\n");
        else printf("\n");
    }
    return 0;
}

相关推荐