【问题标题】:how to represent a number as a sum of 4 primes?如何将一个数表示为 4 个素数之和?
【发布时间】:2011-06-18 10:11:41
【问题描述】:

这是问题 (Summation of Four Primes) 指出:

输入的每一行都包含一个整数 N (N

样本输入:
24
36
46

样本输出:
3 11 3 7
3 7 13 13
11 11 17 7

我第一眼就想到了这个想法

  • 找出所有低于 N 的素数
  • 查找列表长度 (.length = 4) 的整数分区问题(背包)

但我认为这种算法的复杂性非常糟糕。这个问题看起来也像Goldbach's_conjecture 更多的。我该如何解决这个问题?

【问题讨论】:

    标签: algorithm math primes number-theory


    【解决方案1】:

    这个问题有一个简单的技巧。 您可以将所有数字表示为 3+2 + “两个素数之和” 要么 2 + 2 + “两个素数之和” 取决于数字的奇偶性。

    对于“两个素数之和”,使用哥德巴赫猜想。

    【讨论】:

    • +1 这很好。如果它打破了你,你已经解决了哥德巴赫猜想。真可惜,这不是千年问题。对于奇数输入,您将使用2 + x + y + z。对于奇数,哥德巴赫断言它们是三个奇质数之和。
    • 不确定您的评论是否是愤世嫉俗的评论:),但对于较小的值,猜想确实有效。
    • 当您说“基数”时,您的意思是“奇偶性”吗?
    • @Gareth Rees:是的,我的意思是平价,不确定我写基数时的想法。现在已经更正了。
    【解决方案2】:

    1000 万以下的素数大约有 70 万个。

    如果数字是偶数减少 2 x 2,如果是奇数减少 2 + 3,由于哥德巴赫猜想,找到其他两个素数并不困难。

    【讨论】:

      【解决方案3】:

      您可以通过以下代码来实现它,通过将数字设为常量 2 & 2 或 2 & 3,它可以在您的程序中节省大量时间:

      int isPrime(int x) {
          int s = sqrt(x);
          for (int i = 2; i <= s; i++) {
              if (x % i == 0) {
                  return 0;
              }
          }
          return 1;
      }
      void Num(int x, int & a, int & b) {
          for (int i = 2; i <= x / 2; i++) {
              if (isPrime(i) && isPrime(x - i)) {
                  a = i;
                  b = x - i;
                  return;
              }
          }
      }
      int main() {
          int n;
          while (cin >> n) {
              if (n <= 7) {
                  cout << "Impossible." << endl;
                  continue;
              }
              if (n % 2 !=0) {
                  int a, b;
                  Num(n -5, a, b);
                  cout << "2 3 " << a << " " << b << endl;
              }
              else {
                  int a, b;
                  Num(n -4, a, b);
                  cout << "2 2 " << a << " " << b << endl;
              }
          }
          return 0;
      }
      

      【讨论】:

        猜你喜欢
        • 2011-02-14
        • 1970-01-01
        • 2017-12-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多