大家好,小编也是更新了好吧(主要是因为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;
}
}
}
}
好了,今天小编的分享就到这里,再见!