信息学奥赛一本通 1622:Goldbach’s Conjecture | 洛谷 UVA543 Goldbach‘s Conjecture

【题目链接】

ybt 1622:Goldbach's Conjecture
洛谷 UVA543 Goldbach's Conjecture

【题目考点】

1. 筛法求质数表

【解题思路】

首先使用埃筛或线性筛求出质数表。

包括isPrime数组,isPrime[i]表示数值i是否是质数。以及prime数组,prime[i]保存第i个质数,pn是保存在prime数组中的质数的个数。

判断整数n是否可以写成两个奇素数的加和,枚举第一个较小的奇素数。prime[1]是2,是偶数,略过。i从2循环到pn,第一个奇素数为prime[i],而该数是相加的两个素数中的较小的数,因此该数需要满足不超过n的一半,即需要满足prime[i] <= n/2。第一个奇素数是prime[i],要想使两个数加和为n,则第二个数为n-prime[i],判断第二个数是否是素数,可以使用前面求出的isPrime数组,isPrime[n-prime[i]]表示n-prime[i]是否为素数。如果第二个数也是素数,则输出n等于两个数相加的公式,并跳出循环。

虽然哥的巴赫猜想还没有被证明,但在题目给定的范围找到一个偶数不满足哥的巴赫猜想是不可能的,如果你找到了哥的巴赫猜想的反例,都可以得菲尔兹奖了。所以不需要考虑无解的情况。

【题解代码】

解法1:埃筛求质数表

cpp 复制代码
#include <bits/stdc++.h>
using namespace std;
#define N 1000005
bool isPrime[N];
int prime[N], pn;
void initPrime(int n)
{
	memset(isPrime, 1, sizeof(isPrime));
	for(int i = 2; i*i <= n; ++i) if(isPrime[i])
		for(int j = i*i; j <= n; j += i)
			isPrime[j] = false;
	for(int i = 1; i <= n; ++i) if(isPrime[i])
		prime[++pn] = i;
}
int main()
{
	ios::sync_with_stdio(false);
	cin.tie(nullptr); 
	initPrime(1e6);
	int n;
	while(cin >> n && n != 0)
	{
		for(int i = 2; i <= pn && prime[i] <= n/2; ++i) if(isPrime[n-prime[i]])
		{	
			cout << n << " = " << prime[i] << " + " << n-prime[i] << '\n';
			break;
		}
	}
	return 0;
}

解法2:线性筛求质数表

cpp 复制代码
#include <bits/stdc++.h>
using namespace std;
#define N 1000005
bool isPrime[N];
int prime[N], pn;
void initPrime(int n)
{
	memset(isPrime, 1, sizeof(isPrime));
	for(int i = 2; i <= n; ++i)
	{
		if(isPrime[i])
			prime[++pn] = i;
		for(int j = 1; j <= pn && i*prime[j] <= n; ++j)
		{
			isPrime[i*prime[j]] = false;
			if(i%prime[j] == 0)
				break;
		}
	}
}
int main()
{
	ios::sync_with_stdio(false);
	cin.tie(nullptr); 
	initPrime(1e6);
	int n;
	while(cin >> n && n != 0)
	{
		for(int i = 2; i <= pn && prime[i] <= n/2; ++i) if(isPrime[n-prime[i]])
		{	
			cout << n << " = " << prime[i] << " + " << n-prime[i] << '\n';
			break;
		}
	}
	return 0;
}
相关推荐
秋天的怀念_David44 分钟前
算法一千零一夜 · 第二十八夜 注册
java·程序人生·算法
敲上瘾1 小时前
Qt Widgets入门:项目模板解析与Hello World
开发语言·数据库·c++·qt·ui·qt6.3
旖旎夜光2 小时前
【C++ 基础入门】C++ 多态(中):虚函数表、多态原理与动静绑定
开发语言·c++·笔记·学习
NEFU_Jyj3 小时前
贝尔数(组合数学)
算法
希和20273 小时前
C语言程序设计题|有序数组插入数字冒泡排序
c语言·数据结构·算法
旖旎夜光3 小时前
【C++ 基础入门】C++多态(下):单/多继承虚表、多态补充与 21 道高频题
开发语言·c++·笔记·学习
Pniubi3 小时前
力扣73 矩阵置零
算法·leetcode·矩阵
apcipot_rain14 小时前
C++转Java日记(03)
java·开发语言·c++
布莱克60514 小时前
C++ 中 map 的 insert 与 emplace:key 已存在时会覆盖吗?
开发语言·数据结构·c++·算法·map
xys_67814 小时前
深挖C++:类和对象(中)
开发语言·c++