哥德巴赫猜想是世界近代三大数学难题之一。至今还未被成功证明。
虽然哥德巴赫猜想尚未被成功证明,但是这个猜想目前在计算机处理能力范围内是成立的。
哥德巴赫猜想可以描述为:任意一个大于2的偶数都可以写成两个质数之和。
因此,你也来设计一个程序,将给定的大于2的偶数a拆分成两个质数之和。(有多种拆分方案时,输出较小的加数相比其他拆分方法最小的方案)
第一行一个整数q
接下来的q行,每行一个偶数a
q行,每行对应一次询问的答案
- 5
- 4
- 6
- 888
- 890
- 892
- 2 2
- 3 3
- 5 883
- 3 887
- 5 887
对于100%的数据,4≤a≤10^5,1≤q≤10^4
我是没有什么好办法,因为数据范围只到100000,所以我先把100000以内的质数先全找出来,然后在输入a的时候,遍历所有的质数,判断这个质数是不是a的分解方案(两个质数,加起来等于a)的其中一个数,比如,我们定义一个变量c,c=a-当前遍历到的质数;,如果c是质数,那我们就直接输出(因为我们确定当前遍历到的质数是质数,所以只要判断c就好了)
思路还是很简单的,就是暴力
- #include
- using namespace std;
- int zz(long long a){//判断质数
- if(a==1)return 0;
- for(int i=2;i<=sqrt(a);i++)
- if(a%i==0)return 0;
- return 1;
- }
- int main(){
- long long maaa[100000],b[100000],cnt=0,q,a,c;
- for(int i=2;i<=100000;i++){//埃式筛法,把100000以内的质数全存在数组b里面
- if(maaa[i]==0){
- b[++cnt]=i;
- for(long long j=2*i;j<=100000;j+=i)
- maaa[j]=1;
- }
- }
- cin>>q;//读入
- for(int i=1;i<=q;i++){
- cin>>a;//读入
- for(int i=1;i<=cnt;i++){//一共有cnt个质数,这里就是遍历,找a能分成那两个质数
- c=a-b[i];//b[i]为a分成的第一个质数,那c就是a分成的第二个质数
- if(zz(c)){//a=b[i]+c,如果c也是质数,那就输出
-