【C++ 模板迭代器实例/半素数】

题目:判断一个数是不是两个素数的乘积,是输出YES,不是输出NO。数据范围为2-1000000.

       为了解决这个问题,我们继续使用STL——vector & set,分别用来存储素数和半素数。为什么素数的存储不用set呢?因为我们的终极目标不是判断素数,而是半素数。采用vector存储素数有利于线性查找,在for循环中,可直接根据下标遍历素数表。而采用set存储半素数,是因为set是平衡检索二叉树,可以将元素自动排序,检索速度最快。

       这里再复习一下素数的判断方法:首先排除2以外的所有偶数,然后从奇数中排除素数的倍数,剩下的就是素数。不拆分数,而选择查找数,思路很厉害了。

        

 1 #include <iostream>  
 2 #include <vector>  
 3 #include <set>  
 4 #include <cmath>  
 5 using namespace std;  
 6 vector<int> v;  
 7 set<int> s;  
 8 void ChoosePrime(int a,int b)//建立[a,b]范围内的素数表  
 9 {  int i,j;
10     for( i=a;i<=b;i++)  
11     {  
12         //2是素数,这里清楚2的倍数  
13         if(i!=2&&i%2==0) continue;  
14         for(j=3;j*j<=i;j+=2)  
15         {  
16             if(i%j==0) break;  
17         }
18 if(j*j>i)  
19         v.push_back(i);  
20     
21     }  
22 }  
23 int main()  
24 {  
25     ChoosePrime(2,500000);//建立[2,500000]范围内的素数表  
26     int i,j,p;  
27     for(i=0;i<v.size();i++)//建立[2,1000 000]范围内的半素数表  
28     {  
29         for(j=0;j<v.size();j++)  
30         {  
31             p=v[i]*v[j];//两个素数相乘  
32             if(p<1000000) s.insert(p);  
33             else break;  
34         }  
35     }  
36     //读入数据,在半素数表中查找,看是否在该表中  
37     int n;  
38     set<int>::iterator it;  
39     while(cin>>n)  
40     {  
41         it=s.find(n);  
42         if(it!=s.end()) cout<<"Yes"<<endl;  
43         else cout<<"No"<<endl;  
44     }  
45 }  

 

posted @ 2018-05-25 09:31  一头  阅读(799)  评论(0编辑  收藏  举报