【问题标题】:Prime number sum ,Though not really easy素数总和,虽然不是很容易
【发布时间】:2021-10-10 09:28:16
【问题描述】:

给定一个数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 && 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);
        }
    }
}

【问题讨论】:

  • nk的范围是什么?
  • @jarod42 没有提到,一般考虑整数范围
  • 如此蛮力,甚至O(N+K) 似乎都不在考虑范围之内。必须找到一个数学公式。

标签: c++ algorithm dynamic-programming primes


【解决方案1】:

这可以通过假设Goldbach's conjecture 来解决。哥德巴赫猜想说:

任何偶数都是两个素数之和

我们可以利用它来创建以下规则:

  1. 如果 n &lt; 2k 则否(因为 2 是最小的素数)
  2. 如果 k == 1 则 YES IFF n 是素数
  3. If n &gt;= 2kk == 2 THEN YES 如果 n 是偶数(哥德巴赫),如果 n 是奇数则 NO 如果 n-2 不是素数
  4. 如果n &gt;= 2kk &gt;= 3 那么总是是:
    • n 为偶数时,可以表示为2 + ... + 2 + (n - 2 * (k - 2))
      n - 2 * (k - 2) 也是偶数,可以表示为两个素数之和(Goldbach),
    • n为奇数时,可表示为3 + 2 + ... + 2 + (n - 3 - 2 * (k - 3))
      n - 3 - 2 * (k - 3)为偶数,可表示为两个素数之和(哥德巴赫)。

【讨论】:

  • 哥德巴赫猜想仍然是一个猜想,因为它还有待证明。即使verified results 足以达到目的,基于它创建算法也可能不是明智之举。
  • @PalLaden - 好吧,如果算法失败,OP 刚刚找到了哥德巴赫猜想的反例。那是一两美元的奖金。真的没有缺点。
  • @PalLaden 它被证明适用于所有小于4×10^18 的整数,因此出于实际目的,它可以被视为已证明,因为该范围10^9 大于 C++ int 的范围
  • @christian sloper 你的方法似乎很有远见,你也在几分钟内推断出来,这让我很奇怪,谢谢你的回答。
  • @BrettHale 问题是,当算法实际失败时,OP 并不知道算法失败......
猜你喜欢
  • 2015-02-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-27
  • 2020-11-20
相关资源
最近更新 更多