• CCF NOI1066 素数对


    问题链接CCF NOI1066 素数对




    时间限制: 1000 ms  空间限制: 262144 KB

    题目描述 

      两个相差为2的素数称为素数对,如5和7,17和19等,本题目要求找出所有两个数均不大于n的素数对。

    输入

      一个正整数n。1<=n<=10000。

    输出

      按照从小到大的顺序输出所有小于等于n的素数对。每对素数对输出一行,中间用单个空格隔开。若没有找到任何素数对,输出empty。

    样例输入

    100
    样例输出

    3 5
    5 7
    11 13
    17 19
    29 31
    41 43
    59 61
    71 73

    数据范围限制

      1<=n<=10000。

    提示

     




    问题分析

      这是一个孪生素数问题。

      素性测试算法有很多,例如试除法等。

      使用埃氏筛选法可以生成大量的素数,从中找出孪生素数是一种有效的方法。

    程序说明

      函数esieve()实现埃氏筛选法,选出的素数在数组prime[]中,若prime[i]=1则i为素数,若prime[i]=0则i不是素数

      有了数组prime[],就容易找出孪生素数了。

      这种方法最大的好处在于可以避免重复计算。

    要点详解

    • 使用宏定义可以使得代码可阅读性增强。
    • 埃氏筛选法是数论中的内容。



    参考链接:(略)。

    100分通过的C语言程序:

    #include <stdio.h>
    
    #define N 10000
    
    int prime[N+1] = {0, 0, 1};
    
    void esieve(int n)
    {
        int i, j;
    
        for(i=3; i<N; i++) {
            prime[i++] = 1;
            prime[i] = 0;
        }
    
        for(i=3; i*i<=N; i+=2) {
            if(prime[i]) {
                for(j=i+i; j<n; j+=i)    //进行筛选
                    prime[j] = 0;
            }
        }
    }
    
    int main(void)
    {
        int n, i;
    
        scanf("%d", &n);
    
        esieve(n);
    
        for(i=3; i<n-1; i++)
            if(prime[i] && prime[i + 2])
                printf("%d %d
    ", i, i + 2);
    
        return 0;
    }



  • 相关阅读:
    读者试读怎么评价这本书
    性能优化是数据库应用的核心问题
    ExtJS 4 Grid组件
    发挥你的SATA硬盘
    MOSS 修改了服务器账号密码后的问题
    速度真快,ExtJS第5个预览版发布
    Ext JS 4 Preview Release 4发布
    显卡性能排行榜
    手机操作系统发展史
    程序解读身份证的密码
  • 原文地址:https://www.cnblogs.com/tigerisland/p/7563863.html
Copyright © 2020-2023  润新知