如何将数字表示为4个素数的总和?

时间:2011-01-31 07:29:12

标签: algorithm math primes number-theory

问题(Summation of Four Primes)表明:

  

输入在每一行中包含一个整数N(N <= 10000000)。这是您必须表示的四个素数的总和

     

样品输入:
24
36
46   

     

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

乍一看,我想到了这个想法

  • 查找N
  • 以下的所有素数
  • 使用整数分区问题(背包)
  • 查找列表长度(.length = 4)

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

3 个答案:

答案 0 :(得分:9)

这个问题有一个简单的伎俩。 您可以将所有数字表示为3 + 2 +“两个素数的总和” 要么 2 + 2 +“两个素数的总和” 取决于数字的平价。

对于“两个素数的总和”,使用Goldbach的猜想。

答案 1 :(得分:2)

有大约70万个素数低于1000万。

如果该数字甚至从它减少2 x 2并且奇数从它减少2 + 3并且因为哥德巴赫猜想而找到其他两个素数并不困难。

答案 2 :(得分:0)

您可以通过以下代码实现它,它可以节省您的程序中的大量时间,将数字设为常数2&amp; 2或2&amp; 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;
}