永夜初晗凝碧天

本博客现已全部转移到新地址,欲获取更多精彩文章,请访问http://acshiryu.github.io/

导航

POJ2262Goldbach's Conjecture 简单的素数判定

作者:ACShiryu

时间:2011-8-4

原题:http://poj.org/problem?id=2262

Goldbach's Conjecture
Time Limit: 1000MS Memory Limit: 65536K
Total Submissions: 24877 Accepted: 9798

Description

In 1742, Christian Goldbach, a German amateur mathematician, sent a letter to Leonhard Euler in which he made the following conjecture: 
Every even number greater than 4 can be 
written as the sum of two odd prime numbers.

For example: 
8 = 3 + 5. Both 3 and 5 are odd prime numbers. 
20 = 3 + 17 = 7 + 13. 
42 = 5 + 37 = 11 + 31 = 13 + 29 = 19 + 23.

Today it is still unproven whether the conjecture is right. (Oh wait, I have the proof of course, but it is too long to write it on the margin of this page.) 
Anyway, your task is now to verify Goldbach's conjecture for all even numbers less than a million. 

Input

The input will contain one or more test cases. 
Each test case consists of one even integer n with 6 <= n < 1000000. 
Input will be terminated by a value of 0 for n.

Output

For each test case, print one line of the form n = a + b, where a and b are odd primes. Numbers and operators should be separated by exactly one blank like in the sample output below. If there is more than one pair of odd primes adding up to n, choose the pair where the difference b - a is maximized. If there is no such pair, print a line saying "Goldbach's conjecture is wrong."

Sample Input

8
20
42
0

Sample Output

8 = 3 + 5
20 = 3 + 17
42 = 5 + 37
题目大意就是输入一个不小于6的合数,把它表示成两个质数的和,如果有多个,数出相差最大的一组
这题就是简单的枚举+素数判定,没什么技巧
行开始时分解合数时到sqrt(n)时停止,WA了一次,应该是n/2

参考代码:

 1 #include<iostream>
2 #include<cstdlib>
3 #include<cstdio>
4 #include<cstring>
5 #include<algorithm>
6 #include<cmath>
7 using namespace std;
8 bool isprime ( int k )
9 {
10 int t = sqrt ( k + 0.5 ) ;
11 for ( int i = 2 ; i <= t ; i ++ )
12 if ( k % i == 0 )
13 return false ;
14 return true ;
15 }
16 int main()
17 {
18 int n ;
19 while ( scanf ("%d", &n) , n )
20 {
21 int i ;
22 int t = n / 2 ;
23 for ( i = 3 ; i <= t ; i += 2 )
24 if ( isprime ( i ) && isprime ( n - i ) )
25 break ;
26 printf ( "%d = %d + %d\n" , n , i , n - i ) ;
27 }
28 return 0;
29 }

  

posted on 2011-08-04 22:00  ACShiryu  阅读(1998)  评论(1编辑  收藏  举报