新浪微博 Github

POJ 2262:Goldbach's Conjecture

Description

在1742年,Christian Goldbach,一个德国数学家发了一封邮件给欧拉,说明了他的猜想:

  每个超过4的偶数都能写成两个素数相加。

比如:

  8 = 3 + 5.
  20 = 3 + 17 = 7 + 13. 
  42 = 5 + 37 = 11 + 31 = 13 + 29 = 19 + 23.

现在这个猜想是否正确仍没有被证明(当然我已经证明了,但是因为证明过程太长了,所以就不写下来了)。不管怎样,你的任务是验证小于一百万的所有偶数是否满足这个猜想。

Input

输入包含了1个或多个测试用例。
每个测试用例是一个偶数n($6 \leq n<1000000$)。
输入以n=0终止。

Output

对于每个测试用例,输出一行类似“n = a + b”的形式,其中 a 和 b 都是素数。操作数和操作符都应该以空格分开。如果存在多对素数对加起来是n,则选择一对 b-a 最大的素数对。如果没有这样的素数对,则输出“Goldbach's conjecture is wrong.” 

Sample Input

8
20
42
0

Sample Output

8 = 3 + 5
20 = 3 + 17
42 = 5 + 37

Source

思想:一次直接把[1,1000000]的素数全部算好,这样就不用重复运行筛选法了(事实上,重复运行筛选法会TLE)。

 1 import java.util.Scanner;
 2 
 3 public class Main {
 4     boolean[] arr;
 5     public void sieve(int n){
 6         arr = new boolean[n+1];
 7         for(int i=0;i<arr.length;i++)
 8             arr[i] = true;
 9         int bound = (int)Math.floor(Math.sqrt(n));    //根号n
10         for(int i=2;i<=bound;i++){
11             if(arr[i]){
12                 for(int j=2;j*i<=n;j++){
13                     arr[i*j] = false;
14                 }
15             }
16         }
17     }
18     public void fun(int n){
19         for(int i=2;i<=n/2;i++){
20             if(arr[i] && arr[n-i]){
21                 System.out.println(n+" = "+i+" + "+(n-i));
22                 return;
23             }
24         }
25         System.out.println("Goldbach's conjecture is wrong.");
26     }
27     public static void main(String[] args) {
28         Scanner in = new Scanner(System.in);
29         Main main = new Main();
30         main.sieve(1000000);
31         while(true){
32             String line = in.nextLine().trim();
33             int n = Integer.parseInt(line);
34             if(n==0){
35                 return;
36             }
37             main.fun(n);
38         }
39     }
40 }
View Code

 

posted @ 2013-06-09 21:48  xiazdong  阅读(209)  评论(0编辑  收藏  举报