1. 程式人生 > 實用技巧 >ECNU 2877 歌德巴赫猜想

ECNU 2877 歌德巴赫猜想

ECNU 2877 歌德巴赫猜想

連結

https://acm.ecnu.edu.cn/problem/2877/

題目

單點時限: 4.0 sec

記憶體限制: 256 MB

歌德巴赫猜想,是指對於每一個大於 4 的偶數 ,都能表示成兩個質數之和。

現在,你需要寫程式驗證這一猜想。對於n,找出質數a和b, 滿足a+b=n,a<=b,且 a * b 最大。
例如n=8,滿足條件的a和b分別為 3 和 5;

輸入格式
每行一個偶數n(4 < n <= 20000)

輸出格式
對應於每個輸入的偶數,輸出a、一個空格、b、一個換行符

樣例
input
8
10
1000
output
3 5
5 5
491 509

思路

思路不是很麻煩,就是找到和為n的兩個素數,要求這兩個素數積最大。
如果兩個數越接近,那麼積就越大,這就可以從n/2往兩邊找,套一層迴圈即可,check函式用來檢測是否是素數的。
如果題目要求很高,可以先把素數打表存下來,就避免了check函式的反覆運算。
這題最開始我還runtime error,研究下才發現,我寫的是while(true),難怪超時,改成hasNextInt()即可。

程式碼

  public static boolean check(int n) {
    for (int i = 2; i <= n / 2; i++) {
      if (n % i == 0) {
        return false;
      }
    }
    return true;
  }

  public static void fun() {
    Scanner sc = new Scanner(System.in);
    while (sc.hasNextInt()) {
      int n;
      n = sc.nextInt();
      if (n > 20000 || n <= 4 || n % 2 != 0) {
        break;
      }

      for (int i = n / 2; i >= 1; i--) {
        if (check(i) && check(n - i)) {
          System.out.println(i + " " + (n - i));
          break;
        }
      }
    }

  }