寻找素数 Google题

来源:互联网 发布:法恩莎 智能马桶 知乎 编辑:程序博客网 时间:2024/06/05 10:55

找出满足以下条件的最小素数:
a.3个连续素数的和
b.17个连续素数的和
c.45个连续素数的和
d.979个连续素数的和
e.本身为素数

 

  1. #include "stdafx.h"
  2. using namespace std;
  3. int main()
  4. {
  5.     const unsigned int MaxNumber = 10000000;
  6.     const unsigned int conditionNums[] = {3,17,45,979};
  7.     clock_t pretime = clock(); 
  8.     cout << "Start create prime table .../n";
  9.     const unsigned MachineLength = sizeof(unsigned int) << 3;
  10.     const unsigned int MaxSize = MaxNumber / (MachineLength<<1) + 1;
  11.     unsigned int* Number = new unsigned int[MaxSize];
  12.     memset(Number,0xFF,MaxSize*sizeof(unsigned int));
  13.     for(unsigned int num = 3;num<MaxNumber;num+=2){
  14.         if(Number[num/(MachineLength<<1)] & (0x1L<<((num>>1) % MachineLength))) {
  15.             unsigned int NotPrime = num * num; 
  16.             if ((NotPrime / num != num)) 
  17.                 break;
  18.             for(;NotPrime < MaxNumber ;NotPrime += num ) 
  19.                 if(NotPrime % 2) 
  20.                     Number[NotPrime / (MachineLength<<1)] &= ~(0x1L << ((NotPrime>>1) % (MachineLength)));                      
  21.                 else 
  22.                     continue;                       
  23.         }
  24.     }
  25.     vector<unsigned int> PrimeNumber;
  26.     PrimeNumber.push_back(2);
  27.     for(unsigned int num = 3;num < MaxNumber;num +=2)
  28.         if( Number[num /(MachineLength<<1)] & (0x1L<<(num>>1 % (MachineLength)))){
  29.             PrimeNumber.push_back(num);
  30.         }
  31.     delete []Number;
  32.     cout <<"Total "<<MaxNumber<<" Prime Number is "<<PrimeNumber.size()
  33.         <<"/nStart analyze prime table .../n";  
  34.     unsigned long ConditionNumberSize = sizeof(conditionNums)/sizeof(unsigned int);
  35.     vector<set<unsigned int>*> PrimeSet;
  36.     vector<unsigned int> PrimeTotal;
  37.     for(unsigned long i=0;i<ConditionNumberSize;i++)
  38.     {
  39.         PrimeSet.push_back(new set<unsigned int>);
  40.         PrimeTotal.push_back(0);
  41.     }
  42.     for(unsigned int i = 0;i< PrimeNumber.size();i++)
  43.     {
  44.         for(unsigned int size=0;size < ConditionNumberSize;size++)
  45.         {
  46.             PrimeTotal[size] += PrimeNumber[i];
  47.             if(i >= conditionNums[size]){
  48.                 PrimeTotal[size] -= PrimeNumber[i - conditionNums[size]];
  49.                 if(binary_search(PrimeNumber.begin(),PrimeNumber.end(),PrimeTotal[size]))
  50.                     PrimeSet[size]->insert(PrimeTotal[size]);
  51.             }
  52.         }
  53.     }
  54.     set<unsigned int> SolutionSet;
  55.     for(unsigned int i = 0;i<PrimeSet.size()-1;i++)
  56.     {
  57.         SolutionSet.clear();
  58.         set_intersection(PrimeSet[i]->begin(),PrimeSet[i]->end(),PrimeSet[i+1]->begin(),PrimeSet[i+1]->end(),inserter(SolutionSet,SolutionSet.begin()));
  59.         PrimeSet[i]->clear();
  60.         PrimeSet[i+1]->clear();
  61.         PrimeSet[i+1]->operator =(SolutionSet);
  62.     }
  63.     copy(SolutionSet.begin(),SolutionSet.end(),ostream_iterator<unsigned int>(cout,"/t"));
  64.     cout <<endl<<clock() - pretime <<"ms has used."<<endl;
  65.     system("pause");
  66.     return 0;
  67. }

 

 

原创粉丝点击