题目:判断一个数是不是两个素数的乘积,是输出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 }