如何将一个数表示为4个素数之和?

发布于 2024-10-15 05:08:12 字数 552 浏览 9 评论 0原文

这是问题(四个素数的求和)指出:

输入每行包含一个整数 N (N<=10000000)。这是您必须将其表示为四个素数之和的数字

示例输入:
24
36
46

示例输出:
3 11 3 7
3 7 13 13
11 11 17 7

我第一眼就想到了这个想法

  • 查找 N 下面的所有素数
  • 查找列表的长度 (.length = 4) 与整数分区问题 (Knapsack)

但复杂性非常糟糕对于这个算法我认为。这个问题也看起来像Goldbach's_conjecture 更多的。我该如何解决这个问题?

Here is the problem (Summation of Four Primes) states that :

The input contains one integer number N (N<=10000000) in every line. This is the number you will have to express as a summation of four primes

Sample Input:
24
36
46

Sample Output:
3 11 3 7
3
7 13 13
11 11 17 7

This idea comes to my mind at a first glance

  • Find all primes below N
  • Find length of list (.length = 4) with Integer Partition problem (Knapsack)

but complexity is very bad for this algorithm I think. This problem also looks like Goldbach's_conjecture
more. How can I solve this problem?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

霓裳挽歌倾城醉 2024-10-22 05:08:12

这个问题有一个简单的技巧。
您可以将所有数字表示为 3+2 +“两个素数之和”
或者
2 + 2 + “两个素数的和”
取决于数字的奇偶性。

对于“两个素数的和”,使用哥德巴赫猜想。

This problem has a simple trick.
You can express all numbers as 3+2 + "summation of two primes"
or
2 + 2 + "summation of two primes"
depending on parity of the number.

for the "summation of two primes", use Goldbach's Conjecture.

深海夜未眠 2024-10-22 05:08:12

1000万以下的素数大约有70万个。

如果该数字是偶数,则从它减少 2 x 2,如果是奇数,则从它减少 2 + 3,并且由于哥德巴赫猜想,找到其他两个素数并不困难。

There are around 700 thousand primes below 10 million.

If the number is even reduce 2 x 2 from it and if odd reduce 2 + 3 from it and finding the other two primes is not difficult because of Goldbach conjecture.

幽蝶幻影 2024-10-22 05:08:12

您可以通过以下代码来实现它,通过将数字设置为常量 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;
}

You can implement it by the following code it save a lot of time in your program by make to digit as constant 2 & 2 or 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;
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文