您的位置:首页 > 编程语言 > Go语言

POJ-Goldbach's Conjecture-哥德巴赫猜想

2018-02-22 20:38 141 查看
[align=center]哥德巴赫猜想[/align][align=center]题目链接:点击打开链接[/align]题意大概是:一个大于4的偶数必能表示为两个奇素数之和。例如:
8 = 3 + 5;3和5都是奇素数。
20 = 3 + 17 = 7 + 13;
42 = 5 + 37 = 11 + 31 = 13 + 29 = 19 + 23注意到,对于大于4的偶数n (n >= 6 && n % 2 ==0),n = p + q,  p ,q均为素数,不妨设p <= q, 则p必在3与n/2之间

在for循环中判断p为素数时, n - p 是否为素数, 若是,则按照题目要求输出,再continue即可。由于循环时第一个素数p自小向大增加,这就保证了输出的结果符合题意:如果有多于一对奇素数加起来为n,则选择差值b - a最大的那一对。

代码如下:
#include <iostream>
#include <cmath>
using namespace std;

int is_primer(int n); // 判断是否为素数

int main()
{
int i, n, flag = 1; // flag为标识,flag为1时表示哥德巴赫猜想错误
while (cin >> n && n)
{
if (n == 6)
{
cout << "6 = 3 + 3\n";
continue;
}
for (i = 3; i <= n/2; i++) // i从3开始是由于条件给出的是奇素数,而除了2,所有的素数均为奇数
{
if (is_primer(i) && is_primer(n - i)) // 当i和n - i均为奇素数时
{
flag = 0;
cout << n << " = " << i << " + " << n - i << endl;
break;
}
}
if (flag)
cout << "Goldbach's conjecture is wrong.\n";
}
}

int is_primer(int n) // 判断是否为素数
{
if (n <= 1)
return 0;
int m = floor(sqrt(n) + 0.5);
for (int i = 2; i <= m; i++)
{
if (n % i == 0)
return 0;
}
return 1;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: