XDOJ1106 - 哥德巴赫猜想

本文探讨了哥德巴赫猜想,并提供了一个简单的算法验证小于等于100000的偶数可以表示为两个质数之和。通过素数筛选和最优解选择,展示了该猜想在特定范围内的正确性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Description

“自然科学的皇后是数学。数学的皇冠是数论。哥德巴赫猜想,则是皇冠上的明珠。”哥德巴赫猜想表述为:任一大于2的偶数都可写成两个质数之和。当然我们今天不是来证明哥德巴赫猜想的,而是验证对于比较小的偶数其猜想是否成立。

Input

数据的第一行是一个正整数T(0<T<=100),表示有T组测试数据。
每组测试数据只有一行,为一个偶数M(2<M<=100000),表示要验证的偶数。

Output

对于每组测试数据,在一行上输出两个质数A,B(A<=B),表示M=A+B,如果有多种可能,则输出B-A的值最小的那组。

Sample Input

3
6
10
12

Sample Output

3 3
5 5
5 7

解题思路:

主要是考察素数的判断,另外B-A值最小其实就是让A最大。主要还是科普题

公元1742年6月7日哥德巴赫(Goldbach)写信给当时的大数学家欧拉(Euler),提出了以下的猜想:

(a) 任何一个≥6之偶数,都可以表示成两个奇质数之和。  

(b) 任何一个≥9之奇数,都可以表示成三个奇质数之和。

#include<iostream>
using namespace std;
const int N = 100001;
bool isPrime[N];
int primes[N/6];

void getPrimes()
{
    for(int i=0;i<N;++i)
        isPrime[i] = true;
    int k=0;

    for(int i=2;i<N;++i)
    {
        if(isPrime[i])
        {
            for(int j=2*i;j<N;j+=i)
                isPrime[j] = false;
            primes[k++] = i;
        }
    }
}
int main()
{
    int T;
    getPrimes();
    while(cin>>T)
    {
        for(int i=0;i<T;++i)
        {
            int M;
            cin>>M;
            int halfM = M/2;
            int A,B;
            for(int k=0;primes[k]<=halfM;++k)
            {
                if(isPrime[M-primes[k]])
                {
                    A = primes[k];
                    B = M-primes[k];
                }
            }
            cout<<A<<" "<<B<<endl;
        }
    }
    return 0;
}

 

最后欢迎大家访问我的个人网站: 1024s

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值