234 countprime

来源:互联网 发布:伴奏软件手机版 编辑:程序博客网 时间:2024/06/05 15:13
[cpp] view plain copy
 print?
int countPrimes(int n) {  
    int i =0, count=0;  
  1.     for (i=1; i<n; i++)  
  2.     {  
  3.         if (isprime(i))  
  4.         {  
  5.             count++;  
  6.             prim_vec.push_back(i);  
  7.         }  
  8.     }  
  9.     return count;  
  10.    }  

判断是否是素数,最简单的代码如下,但这样提交时会超时。

[cpp] view plain copy
 print?
  1. bool isprime(int n)  
  2. {  
  3.     if (n < 2)  
  4.         return false;  
  5.     if (n ==2 )  
  6.         return true;  
  7.     int tmp = sqrt(n);  
  8.     for (int i=1; i<tmp; i++)  
  9.     {  
  10.         if (n % i == 0)  
  11.              return false;
  12.     }  
  13.     return true;  
  14. }  

对算法进行改进,将判断能否被小于sqrt(n)的数整除,改为能否被小于sqrt(n)的素数整除,可以节省很多计算量,大大减少计算的次数。这样就需要将以前计算的素数都记下来,所以使用一个全局的vector prim_vec 来记录计算过的素数。

对素数的判断代码改进如下:

[cpp] view plain copy
 print?
  1. vector<int> prim_vec;  
  2. bool isprime(int n)  
  3. {  
  4.     if (n < 2)         
  5.         return false;  
  6.     if (n == 2)  
  7.         return true;  
  8.     if(n %2 == 0)  
  9.         return false;  
  10.     int sq = sqrt(n);  
  11.     int len = prim_vec.size();  
  12.     for (int index=0; index<len;index++)  
  13.     {  
  14.         int tmp = prim_vec[index];  
  15.         if(tmp > sq)  
  16.             break //这句如果不加,也会TLE
  17.         if (n % tmp == 0)  
  18.             return false;  
  19.     }  
  20.     return true;  
  21. }  

题目完整代码如下:

[cpp] view plain copy
 print?
  1. class Solution {  
  2. public:  
  3.     vector<int> prim_vec;  
  4.     bool isprime(int n)  
  5.     {  
  6.     if (n < 2)         
  7.             return false;  
  8.         if (n == 2)  
  9.             return true;  
  10.         if(n %2 == 0)  
  11.             return false;  
  12.         int sq = sqrt(n);  
  13.         int len = prim_vec.size();  
  14.         for (int index=0; index<len;index++)  
  15.         {  
  16.             int tmp = prim_vec[index];  
  17.             if(tmp > sq)  
  18.                 break;  
  19.             if (n % tmp == 0)  
  20.                 return false;  
  21.         }  
  22.         return true;  
  23.     }  
  24.     int countPrimes(int n) 
  25.     {  
  26.         int i =0, count=0;  
  27.         for (i=1; i<n; i++)  
  28.         {  
  29.             if (isprime(i))  
  30.             {  
  31.                 count++;  
  32.                 prim_vec.push_back(i);  
  33.             }  
  34.         }  
  35.         return count;  
  36.     }  
  37. };

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 洗了翻毛的鞋子怎么办 猫眼竹芋泡根了怎么办 双线花叶子卷了怎么办 华为云收藏满了怎么办 小米6云空间满了怎么办 华为云存储已满怎么办 苹果云备份空间不足怎么办 oppor9指纹与密码忘记怎么办 oppo显示密码格式不对怎么办 oppo云服务密码忘了怎么办 小米云内存满了怎么办 id储存空间满了怎么办 苹果手机邮箱服务器连接失败怎么办 苹果查看id闪退怎么办 域名卖出去后涉及赌博怎么办 发票认证后对方作废了怎么办 手机在屋里没信号怎么办 百度云上传文件和谐怎么办 收货地址写错了怎么办 阿里巴巴国际版出现加密令牌怎么办 淘宝寄货到转运仓拒收怎么办 淘宝已发货买家申请退货怎么办 买家给了一个差评不接电话怎么办 卖家单号填错了怎么办 拼多多虚假发货买家怎么办 买家退款后又收到货怎么办 买家确认收货已超时怎么办 淘宝买家不确认收货怎么办 买家快递单号填错怎么办 买家不确认收货不评价怎么办 淘宝不给改地址怎么办 淘宝快递发货后申请退款怎么办 摄影公司收钱后跑了怎么办 淘宝上申请退款卖家不处理怎么办 淘宝买东西商家发错货退回怎么办 假模特头头发毛燥怎么办 投资了网上融资平台被骗怎么办 微信被覆盖了怎么办 微信号被覆盖了怎么办 样品鞋子在灯光下变黄怎么办 美图秀秀拼图后发朋友圈模糊怎么办