题目1163:素数

题目描述:

输入一个整数n(2<=n<=10000),要求输出所有从1到这个整数之间(不包括1和这个整数)个位为1的素数,如果没有则输出-1。

输入:

输入有多组数据。
每组一行,输入n。

输出:

输出所有从1到这个整数之间(不包括1和这个整数)个位为1的素数(素数之间用空格隔开,最后一个素数后面没有空格),如果没有则输出-1。

样例输入:
100
样例输出:
11 31 41 61 71

代码:

#include <stdio.h>
bool s[10001];
int ans[10000];
void init() {
    int i,j=0,k;
    for(i=2;i<=10000;i++)
        s[i] = false;
    for(i=2;i<=10000;i++) {
        if(s[i] == true) continue;
        ans[j++] = i;
        for(k=i*i;k<=10000;k+=i)
            s[k] = true;
    }
}
int main() {
    int n,i;
    init();
    while(scanf("%d",&n)!=EOF) {
        bool first = true;
        for(i=2;i<n;i++) {
            if(!s[i] && i%10==1) {
                if(first) {
                    printf("%d",i);
                    first = false;
                }
                else
                    printf(" %d",i);
            }
        }
        if(first)
            printf("-1");
        printf("\n");
    }
    return 0;
}
                
                

如何找出0到1000000中所有的素数?可以依次枚举每个数,判断每个数是否是素数,但是这样时间复杂度

太高,不具有技巧性。

本题采用了一种更为优雅的方法。

若一个数不是素数,则必存在一个小于它的素数是它的因数。假如我们已经获得小于某一个数的所有素数,我们

只需确定该数不能被这些素数整除,即可确定该数为素数。
当我们获得一个素数时,就把它所有的倍数标记为非素数,如果一个数没有被任何小于它的素数标记,则它为非

素数。

----------这个方法就称为-----素数筛法。


1.定义init()函数,计算从0到10000内所有的素数,只需在main函数开始处运行一次即可。

2.注意不存在素数的要输出-1

3.当判定i为素数时,标记其所有倍数时,我们并没有从2*i开始,而是从i*i开始。因为对于i*k(k<i)必已经求过了k的倍数,所以它

已经被标记过了。避免了重复的计算。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值