精选问答
c++哥德巴赫猜想(升级版)求程序1742年6月7日哥德巴赫写信给当时的大数学家欧拉,正式提出了以下的猜想:任何一个大于9的奇数都可以表示成3个质数之和。质数是指除了1和本身之外没有其他约数的数,如2和11都是质数,而6不是质数,因为6除了约数1和6之外还有约数2和3。需要特别说明的是1不是质数。 这就是哥德巴赫猜想。欧拉在回信中说,他相信这个猜想是正确的,但他不能证明。 从此,这道数学难题引起了几乎所有数学家的注意。哥德巴赫猜想由此成为数学皇冠上一颗可望不可及的“明珠”。现在请你编一个程序验证哥德巴赫猜

2019-04-13

c++哥德巴赫猜想(升级版)求程序
1742年6月7日哥德巴赫写信给当时的大数学家欧拉,正式提出了以下的猜想:任何一个大于9的奇数都可以表示成3个质数之和。质数是指除了1和本身之外没有其他约数的数,如2和11都是质数,而6不是质数,因为6除了约数1和6之外还有约数2和3。需要特别说明的是1不是质数。 这就是哥德巴赫猜想。欧拉在回信中说,他相信这个猜想是正确的,但他不能证明。 从此,这道数学难题引起了几乎所有数学家的注意。哥德巴赫猜想由此成为数学皇冠上一颗可望不可及的“明珠”。
现在请你编一个程序验证哥德巴赫猜想。
先给出一个奇数n,要求输出3个质数,这3个质数之和等于输入的奇数。
输入格式:
仅有一行,包含一个正奇数n,其中9
优质解答

分析:n比较小,考虑制作素数表,枚举方案。

#include <iostream>
#include <fstream>
#include <cstring>
#include <cstdlib>
#include <cstdio>
#include <algorithm>
using namespace std;

int n;

bool isPal[20010];

void _init(void);

int main()
{
\x09cin >> n;
\x09
\x09_init();
\x09
\x09for (int i=2; i<n; ++i)
\x09{
\x09\x09if (isPal[i])
\x09\x09{
\x09\x09\x09int v = n - i;
\x09\x09\x09int mid = v >> 1;
\x09\x09\x09for (int j=2; j<mid; ++j)
\x09\x09\x09{
\x09\x09\x09\x09if (isPal[j] && isPal[v-j])
\x09\x09\x09\x09{
\x09\x09\x09\x09\x09cout << i << ' ' << j << ' ' << v-j << endl;
\x09\x09\x09\x09\x09return 0;
\x09\x09\x09\x09}
\x09\x09\x09}
\x09\x09}
\x09}
\x09
\x09return 0;
}

inline void _init(void)
{
\x09memset(isPal, true, sizeof(isPal));
\x09
\x09isPal[1] = false;
\x09
\x09for (int k=2; k<n; ++k)
\x09{
\x09\x09if (isPal[k])
\x09\x09{
\x09\x09\x09int p = k*2;
\x09\x09\x09while (p < n)
\x09\x09\x09{
\x09\x09\x09\x09isPal[p] = false;
\x09\x09\x09\x09p += k;
\x09\x09\x09}
\x09\x09}
\x09}
}

您的采纳是我回答的最大动力!若有疑问可以追问哦!

分析:n比较小,考虑制作素数表,枚举方案。

#include <iostream>
#include <fstream>
#include <cstring>
#include <cstdlib>
#include <cstdio>
#include <algorithm>
using namespace std;

int n;

bool isPal[20010];

void _init(void);

int main()
{
\x09cin >> n;
\x09
\x09_init();
\x09
\x09for (int i=2; i<n; ++i)
\x09{
\x09\x09if (isPal[i])
\x09\x09{
\x09\x09\x09int v = n - i;
\x09\x09\x09int mid = v >> 1;
\x09\x09\x09for (int j=2; j<mid; ++j)
\x09\x09\x09{
\x09\x09\x09\x09if (isPal[j] && isPal[v-j])
\x09\x09\x09\x09{
\x09\x09\x09\x09\x09cout << i << ' ' << j << ' ' << v-j << endl;
\x09\x09\x09\x09\x09return 0;
\x09\x09\x09\x09}
\x09\x09\x09}
\x09\x09}
\x09}
\x09
\x09return 0;
}

inline void _init(void)
{
\x09memset(isPal, true, sizeof(isPal));
\x09
\x09isPal[1] = false;
\x09
\x09for (int k=2; k<n; ++k)
\x09{
\x09\x09if (isPal[k])
\x09\x09{
\x09\x09\x09int p = k*2;
\x09\x09\x09while (p < n)
\x09\x09\x09{
\x09\x09\x09\x09isPal[p] = false;
\x09\x09\x09\x09p += k;
\x09\x09\x09}
\x09\x09}
\x09}
}

您的采纳是我回答的最大动力!若有疑问可以追问哦!

相关问答