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;
        }
      }
    }

  }
原文地址:https://www.cnblogs.com/blogxjc/p/14261526.html