哥德巴赫猜想2(另一种)(猜想专题3)

大家好,小编也是更新了好吧(主要是因为CSP,当然再找个c++能解决的猜想也挺难的)。

今天给大家带来的是哥德巴赫猜想的另一种情况,题目如下:

每个大于7的奇数都能表示3个不同奇质数之和,如9=3+3+3,15=3+5+7等。

其实转化后就相当于2n - 1 = a + b + c(a,b,c均为质数)。

既然这样,我们先编以下判断质数的程序:

int isprime(int x){
	if(x <= 1){
		return false;
	}
	for(int i=2;i <= x-1;i++){
		if(x % i == 0){
			return false;
		}else{
			return true;
		}
	}
}

编好了。

当然,在《哥德巴赫猜想(猜想专题1)》时已经有过解释了。

接下来就不同了,因为它是3个数,应该是这样的:

for(int i = 1;i <= n;i++){
	for(int j = 1;j <= n;j++){
		for(int k = 1;k <= n;k++){
				
		}
	}
}

但在正常题目里他的复杂度为O(n ^ 3),非常容易超时,因此我们需要想个方法简化一下这个三重循环。

我们发现,当i,j都确定后,k刚好是原数n-i-j,那我们就简化成双重循环:

for(int i = 1;i <= n;i++){
	for(int j = 1;j <= n;j++){
		int k = n - i - j;
			
	}
}

这样复杂度变为O(n ^ 2),大大提升了运算速度。

那接下来就是判断,很简单一笔带过:

if(isprime(i) && isprime(j) && isprime(k)){
	cout << n << "=" << i << "+" << j << "+" << k << endl;
	return 0;
}

接下来,完工了......吗?

我们再看一遍题目,发现是3个奇质数之和,所以还得判断一下三个数的奇偶性:

int parity(int n){
	if(n % 2 == 1) return true;
	return false;
}

写到这里,再把判断改一下,也总算是完成了......么?

我们发现题目说的是3个不同奇质数之和,所以还要加3个个判断,最后获得了非常长的一个判断:

if(isprime(i) && isprime(j) && isprime(k) && parity(i) && parity(j) && parity(k) && i != j && j != k && i != k){
	cout << n << "=" << i << "+" << j << "+" << k << endl;
	return 0;
}

这里才算真正编完了,下面是完整代码:

#include <iostream>
using namespace std;

int parity(int n){
	if(n % 2 == 1) return true;
	return false;
}

int isprime(int x){
	if(x <= 1){
		return false;
	}
	for(int i = 2;i <= x - 1;i++){
		if(x % i == 0){
			return false;
		}else{
			return true;
		}
	}
}

int main(){
	int n;
	cin >> n;
	for(int i = 1;i <= n;i++){
		for(int j = 1;j <= n;j++){
			int k = n - i - j;
			if(isprime(i) && isprime(j) && isprime(k) && parity(i) && parity(j) && parity(k) && i != j && j != k && i != k){
				cout << n << "=" << i << "+" << j << "+" << k << endl;
				return 0;
			}
		}
	}
	
}

好了,今天小编的分享就到这里,再见!

  • 12
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值