zoukankan      html  css  js  c++  java
  • 孪生素数(素数打表,前缀和)

                                                        孪生素数

                           Time Limit: 2 Sec  Memory Limit: 128 MB

    Description

           2013年5月华人数学家张益康在《数学年刊》中发表的一篇论文解决世界性数学难题——孪生素数猜想。

           所谓孪生素数指的就是这种间隔为 2 的相邻素数,它们之间的距离已经近得不能再近了,就象孪生兄弟一样。最小的孪生素数是 (3, 5),在 100 以内的孪生素数还有 (5, 7), (11, 13), (17, 19), (29, 31), (41, 43), (59, 61) 和 (71, 73),总计有 8 组。但是随着数字的增大,孪生素数的分布变得越来越稀疏,寻找孪生素数也变得越来越困难。那么会不会在超过某个界限之后就再也不存在孪生素数了呢?

          给定一个n,你编程求出n之前的孪生素数的个数。

    Input

    多组测试数据,每行一个n(0<n<1000000)

    最后以0结束

    Output

    每组测试数据输出占一行,该行为n范围内所有孪生素数组数。

    最后的0不用处理。

    Sample Input

    10
    100
    0

    Sample Output

    2
    8

    该题数据量较大,暴力一定会时间超限,所以可以先打一个素数表,但是打完表后还是不能暴力,数据太多

    这里就运用到了一种前缀和的思想。具体就是用一个全局数组ans[],用ans[i]来保存前i个数中所包含的1出现的次数之和 。而且提前算好ans[n]的值。那么每组数据就可以直接用ans[n]来计算。时间复杂度就会大大降低。

    这是我的代码

    #include <stdio.h>
    #include <iostream>
    using namespace std;
    int a[1001000]={0},ans[1001000]={0};
    int cc(int n)
    {
        if(a[n]==0&&a[n-2]==0)
            return 1;
        else
            return 0;
    }
    int main()
    {
        int i,j,k;
        a[0]=1;
        a[1]=1;
        for(i=2;i<1000100;i++)
        {
            if(!a[i])
            for(j=i+i;j<1000100;j+=i)
                a[j]=1;
        }
    
        ans[1]=0;
        for(i=2;i<1000100;i++)
            ans[i]=cc(i)+ans[i-1];
        for(;;)
        {
            int n;
            scanf("%d",&n);
            if(n==0)
                break;
            printf("%d
    ",ans[n]);
        }
        return 0;
    }

    我觉得前缀和的思想就是一种预处理,是一种以空间换时间的做法。就是先提前求得ans[i],保存下来,以后计算的时候直接用。动态规划就经常用到这样的手段。

      另一道前缀和的题    :https://blog.csdn.net/Septembre_/article/details/81088562

  • 相关阅读:
    POJ 3140 Contestants Division (树dp)
    POJ 3107 Godfather (树重心)
    POJ 1655 Balancing Act (树的重心)
    HDU 3534 Tree (经典树形dp)
    HDU 1561 The more, The Better (树形dp)
    HDU 1011 Starship Troopers (树dp)
    Light oj 1085
    Light oj 1013
    Light oj 1134
    FZU 2224 An exciting GCD problem(GCD种类预处理+树状数组维护)同hdu5869
  • 原文地址:https://www.cnblogs.com/jk17211764/p/9677404.html
Copyright © 2011-2022 走看看