zoukankan      html  css  js  c++  java
  • Sum of Consecutive Prime Numbers POJ

    题意:给一个数 可以写出多少种  连续素数的合

    思路:直接线性筛 筛素数 暴力找就行   (素数到n/2就可以停下了,优化一个常数)

    其中:线性筛的证明参考:https://blog.csdn.net/nk_test/article/details/46242401

                https://blog.csdn.net/qq_40873884/article/details/79124552

                https://blog.csdn.net/baoli1008/article/details/50788512

    线性筛的思想 就是 每个数都有一个最小的质因素  外层i是质因数个数 内层j是primes[i]的标号  用每个质因数筛 每个数只要被筛一遍

          同时, if(i%primes[j]==0 )break; 这里指的是如果i%primes[j]==0了 那么i就有因数 primes[j] 所以i*prime[j+1]肯定已经被筛掉了

                          因为是从小到大开始筛的,i中还有primes[j] 说明 i*primes[j+1]最小的质因数等于primes[j]  所以肯定会被筛掉 只是可能循环轮次

          不同,可能是下一个i或者其他i

     1 #include<cstdio>
     2 #include<cstring>
     3 using namespace std;
     4 bool Is_Primes[10005];
     5 int Primes[10005];
     6 int cnt;
     7 void Prime(int n){
     8      cnt=0;
     9      memset(Is_Primes,0,sizeof(Is_Primes));
    10     for(int i=2;i<=n;i++){
    11         if(!Is_Primes[i])
    12             Primes[cnt++]=i;
    13         for(int j=0;j<cnt&&i*Primes[j]<n;j++){
    14             Is_Primes[Primes[j]*i]=1;
    15             if(i%Primes[j]==0)break;
    16         }
    17     }
    18 }
    19 int main(){
    20     int n;
    21     Prime(10003);
    22     while(scanf("%d",&n)==1&&n){
    23         int ans=0;
    24         for(int i=0;i<cnt&&Primes[i]<=n;i++){
    25             int temp=i;
    26             int sum=0;
    27             while(sum<n&&temp<cnt){
    28                 sum+=Primes[temp++];
    29             }
    30             if(sum==n)ans++;
    31         }
    32         int flag=0;
    33     
    34         printf("%d
    ",ans);
    35     }
    36     return 0;
    37 }
  • 相关阅读:
    乱七八糟
    堆-heap
    转linux文件的读写
    @转EXT2->EXT3->EXT4
    (转)僵死进程与孤儿进程
    java
    poj-1062-昂贵的聘礼
    java 之 wait, notify, park, unpark , synchronized, Condition
    事物(笔记)
    BPX-tree
  • 原文地址:https://www.cnblogs.com/ttttttttrx/p/10279595.html
Copyright © 2011-2022 走看看