как представлять число в виде суммы 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;
}