#c #algorithm #dynamic-programming #primes
Вопрос:
Учитывая число n
и целое k
число , проверьте, суммируется ли k простых чисел n
или нет.
input 13 2
output: yes
explanation: 11 2 equals 13
поскольку предполагается, что k является любым общим целым числом, я не знаю, как его решить. Я думал решить эту проблему, создав набор всех простых чисел и ища число k, но даже если k равно 5, для этого нам нужно запустить цикл от 4 до 5. как подойти к такой проблеме, любезно обращаюсь за помощью,спасибо.
Я попробовал исходный код как:
#include<iostream>
#include<unordered_set>
#include<vector>
using namespace std;
bool is_prime(int n){
bool flag =true;
for(int i=2;i<n;i ){
if(n%i==0 amp;amp; n!=i){
flag=false;
break;
}
}
if(flag){
return true;
}
return false;
}
int main(){
int n;cin>>n;
int k;cin>>k;
unordered_set<int>s;
for(int i=2;i<n;i ){
if(is_prime(i)){
s.insert(i);
}
}
}
Комментарии:
1. Каковы диапазоны
n
иk
?2. @jarod42 ничего не было упомянуто, рассмотрим диапазон целых чисел в целом
3. Так что грубая сила или даже
O(N K)
, кажется, не учитывается. Нужно найти математическую формулу.
Ответ №1:
Это может быть решено, если принять гипотезу Гольдбаха. Гипотеза Гольдбаха гласит:
Любое четное целое число является суммой двух простых чисел
Мы можем использовать это для создания следующих правил:
- Если
n < 2k
тогда НЕТ (потому что 2-наименьшее простое число) - Если
k == 1
тогда ДА, если n является простым - Если
n >= 2k
иk == 2
ТОГДА ДА , если n четно (Гольдбах), если n нечетно, то НЕТ, если n-2 не является простым числом - Если
n >= 2k
иk >= 3
ТОГДА Всегда ДА:- Когда
n
четно, это может быть выражено как2 ... 2 (n - 2 * (k - 2))
,
n - 2 * (k - 2)
также четно и может быть выражено как сумма двух простых чисел (по Гольдбаху), - Когда
n
нечетно, это может быть выражено как3 2 ... 2 (n - 3 - 2 * (k - 3))
,
n - 3 - 2 * (k - 3)
является четным и может быть выражено суммой двух простых чисел (Гольдбах).
- Когда
Комментарии:
1. Гипотеза Гольдбаха все еще остается гипотезой, потому что ее еще предстоит доказать. Создание алгоритма на его основе может быть неразумным шагом, даже если проверенных результатов достаточно для этой цели.
2. @PalLaden — Ну, если алгоритм не сработает, операция только что нашла контраргумент гипотезе Гольдбаха. Это приз в 1 миллион долларов или два прямо здесь. На самом деле нет никакой обратной стороны.
3. @PalLaden это доказано для всех целых чисел меньше
4×10^18
, поэтому для практических целей это можно считать доказанным, потому что этот диапазон10^9
больше, чем диапазон C int4. @christian sloper ваш подход кажется дальновидным, и вы тоже пришли к нему за пару минут, это заставило меня задуматься, спасибо за ответ.
5. @BrettHale Проблема в том, что операция не знает, что алгоритм терпит неудачу, когда он на самом деле терпит неудачу…