POJ2262-Goldbach'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 }

你可能感兴趣的:(dba)