Сумма простых чисел ,хотя и не очень простая

#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:

Это может быть решено, если принять гипотезу Гольдбаха. Гипотеза Гольдбаха гласит:

Любое четное целое число является суммой двух простых чисел

Мы можем использовать это для создания следующих правил:

  1. Если n < 2k тогда НЕТ (потому что 2-наименьшее простое число)
  2. Если k == 1 тогда ДА, если n является простым
  3. Если n >= 2k и k == 2 ТОГДА ДА , если n четно (Гольдбах), если n нечетно, то НЕТ, если n-2 не является простым числом
  4. Если 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 int

4. @christian sloper ваш подход кажется дальновидным, и вы тоже пришли к нему за пару минут, это заставило меня задуматься, спасибо за ответ.

5. @BrettHale Проблема в том, что операция не знает, что алгоритм терпит неудачу, когда он на самом деле терпит неудачу…