как представлять число в виде суммы 4 простых чисел?

вот в чем проблема (сумма четырех простых чисел) указано, что :

вход содержит одно целое число N (n

Пример Ввода:
24
36
46

Пример Вывода:
3 11 3 7
3 7 13 13
11 11 17 7

эта идея приходит мне на ум на первый взгляд

  • найти все простые числа ниже N
  • найти длину списка (.length = 4) с целочисленной проблемой разбиения (ранец)

но сложность очень плоха для этого алгоритма, я думаю. Эта проблема также выглядит как Гольдбах's_conjecture больше. Как я могу решить эту проблему?

3 ответов


эта проблема имеет простой трюк. Вы можете выразить все числа как 3+2 + "суммирование двух простых чисел" или 2 + 2 + "сумма двух простых чисел" в зависимости от четности числа.

для" суммирования двух простых чисел " используйте гипотезу Гольдбаха.


есть около 700 тысяч простых чисел ниже 10 миллионов.

Если число четное уменьшить 2 x 2 от него и если нечетное уменьшить 2 + 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;
}