zoukankan      html  css  js  c++  java
  • POJ2262Goldbach's Conjecture

    转载请注明出处:優YoU http://user.qzone.qq.com/289065406/blog/1299063931

    提示:100W真是大的BT。。。。我用了优化还是勉强AC掉,认识的一位达人,16ms AC这题,Orz....

    解题思路:

     

    如果还是按常规方法求一百万内的所有素数(就是除法求模),时间复杂度是大到难以置信的。因此必须转换思路进行优化,用加法代替除法,用空间换取时间!计算算加法绝对要比除法快得多,而且一百万个地址,也就是差不多1MB的内存,相信现在99%的电脑还是可以很轻松地拿出来的!

     

    判断素数的优化:

    1、 素数除2外都是偶数,先减半

    2、 递归法:如果一个数不能被比它小的所有素数整除,那么它就是素数。

    3、 根号法:如果一个数X不能被 [2, 根号X ] 内的所有数整除,那么它就是素数

     

    组合上面三个方法,可以大大减少时间复杂度,其实第3点是最有效的省时方法,能够少做很多除法。

     1 //Memory       Time 
    2 //228K 907MS
    3 #include<iostream>
    4 using namespace std;
    5
    6 bool judge_prime(int digit)
    7 {
    8
    9 int i,flag;
    10 if(digit%2==0)
    11 return false;
    12 else
    13 {
    14 for(i=3,flag=1;i*i<=digit;i+=2)
    15 if(digit%i==0)
    16 {
    17 flag=0;
    18 break;
    19 }
    20 if(flag)
    21 return true;
    22 }
    23 return false;
    24 }
    25
    26 int main(void)
    27 {
    28 int temp,num,flag;
    29 for(;;)
    30 {
    31 cin>>num;
    32 if(num%2!=0||num<6)
    33 return 0;
    34 for(temp=3,flag=1;temp<=num/2;temp+=2)
    35 if(judge_prime(temp)&&judge_prime(num-temp))
    36 {
    37 cout<<num<<" = "<<temp<<" + "<<num-temp<<endl;
    38 flag=0;
    39 break;
    40 }
    41 if(flag)
    42 cout<<"Goldbach's conjecture is wrong."<<endl;
    43
    44 }
    45 return 0;
    46 }
    [ EXP技术分享博客 ] 版权所有,转载请注明出处: http://exp-blog.com
  • 相关阅读:
    vs 2005 使用 UpdatePanel 配置
    gridview checkbox 列
    csv 格式文件 导入导出
    UML中数据流图,用例图,类图,对象图,角色图,活动图,序列图详细讲述保存供参考
    c# 根据经纬度 求两点之间的距离
    c# 加密汇总
    日期获取 第一天,最后一天
    求点到直线的垂足
    c# 修改注册表
    HDOJ_1548 上楼梯 DJ
  • 原文地址:https://www.cnblogs.com/lyy289065406/p/2120484.html
Copyright © 2011-2022 走看看