本文主要是介绍P1304 哥德巴赫猜想题解,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
题目
输入一个偶数N,验证4∼N所有偶数是否符合哥德巴赫猜想:任一大于2的偶数都可写成两个质数之和。如果一个数不止一种分法,则输出第一个加数相比其他分法最小的方案。例如10,10=3+7=5+5则10=5+5是错误答案。
输入输出格式
输入格式
第一行输入一个正偶数N
输出格式
输出(N-2)/2行。对于第i行:
首先先输出正偶数2i+2,然后输出等号,再输出加和为2i+2且第一个加数最小的两个质数,以加号隔开
输入输出样例
输入
10
输出
4=2+2
6=3+3
8=3+5
10=3+7
代码
第一种方法采用的是打表法,这个方法同样可以用于其他场景中,也就是将具有某一个特征的一定范围内的数字全部找到,放到一个数组里面,后面的操作直接在里面查询。
#include <cstdio>//将所有的质数找出来
#include<cmath>
using namespace std;
bool isprime(int x){ for(int i = 2; i < sqrt(x); i++){if(x % i == 0){return false;}}return true;
}
int main(){freopen("text.out", "w", stdout); printf("{"); for(int i = 2; i <= 10000; i ++){ if(isprime(i)){ printf("%d,", i); }}printf("}"); return 0;
}//打表
#include <cstdio>
#include <cstring>
using namespace std;
bool isprime[10005];
int primes[] = {/*将打表法得出来的质数放进去*/};
int main(){memset(isprime, false, sizeof(isprime));int n;int len = sizeof(primes) / sizeof(int) - 1;for(int i = 1; i <= len; i ++){isprime[primes[i]] = true;} scanf("%d", &n);for(int i = 4; i <= n; i += 2){ for(int j = 1; j <= len; j ++){ if(isprime[i - primes[j]]){ printf("%d=%d+%d\n", i, primes[j], i - primes[j]); break; }}}return 0;
}
第二种方法是直接开始操作,关注输出的特征。
#include <cstdio>
#include <algorithm>
#include<cmath>
using namespace std;
bool is_prime(int x)
{for(int i = 2;i<=sqrt(x);i++){if(x % i == 0)return false;}return true;
}
void write(int a)
{if(a == 4){printf("4=2+2\n");return;}for(int i = 3;i + 2 <= a;i += 2){if(is_prime(i) && 2 + i == a){printf("%d=2+%d\n",a,i);return;}}for(int i = 3;i + 3 <= a;i += 2){if(is_prime(i) && is_prime(a - i)){printf("%d=%d+%d\n",a,min(i,a - i),max(i,a - i));return;}}
}
int n;
int main()
{scanf("%d",&n);for(int i = 4;i <= n;i += 2)write(i);return 0;
}
这篇关于P1304 哥德巴赫猜想题解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!