zoukankan      html  css  js  c++  java
  • 【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 }  
  • 相关阅读:
    登录注册功能
    29-----BBS论坛
    linux笔记
    nginx,uwsgi发布web服务器
    linux常用服务部署
    linux系统基础优化及常用命令
    linux基本操作命令
    linux命令
    linux基础
    阿里云服务器搭建
  • 原文地址:https://www.cnblogs.com/yitou13/p/9086759.html
Copyright © 2011-2022 走看看