7-236 验证哥德巴赫猜想

哥德巴赫猜想之一是指一个偶数(2除外)可以拆分为两个素数之和。请验证这个猜想。
因为同一个偶数可能可以拆分为不同的素数对之和,这里要求结果素数对彼此最接近。

输入格式:

首先输入一个正整数T,表示测试数据的组数,然后是T组测试数据。每组测试输入1个偶数n(6≤n≤10000)。

输出格式:

对于每组测试,输出两个彼此最接近的素数a、b(a≤b),两个素数之间留1个空格。

输入样例:

2
30
40

输出样例:

13 17
17 23

代码长度限制

16 KB

时间限制

400 ms

内存限制

64 MB

思路

首先输入一个偶数 n,要求找到两个素数 a 和 b,使它们的和等于 n,并且它们的距离(b-a)最小。

因为 n 是偶数,所以其中必有一个素数是偶数,那么另一个素数就是奇数。我们只需要枚举 2~n/2 范围内的所有奇数,依次判断它们和 n 减去它们的差是否都是素数,如果是,则记录下当前的差,判断它是否比之前的更小,如果更小,则更新最小值和对应的素数。

代码

#include <stdio.h>
#include <math.h>

// 判断一个数是否为素数
int sushu(int x) {
    if (x < 2) return 0; // 排除1以下的数
    for (int i = 2; i <= sqrt(x); i++) { // 只判断到根号x,可以降低时间复杂度
        if (x % i == 0) {
            return 0; // 如果能被整除,则不是素数
        }
    }
    return 1;
}

int main() {
    int T, n, a, b, min_diff;

    scanf("%d", &T); // 输入测试数据组数

    for (int i = 0; i < T; i++) { // 循环处理每一组测试数据
        scanf("%d", &n); // 输入目标偶数

        min_diff = n; // 初始化距离最小值
        a = 0;   // 初始化第一个素数
        b = 0;   // 初始化第二个素数

        // 枚举所有可能的素数对
        for (int j = 2; j <= n / 2; j++) {
            if (sushu(j) && sushu(n - j)) { // 如果俩个数都是素数
                if (n - j - j < min_diff) {     // 如果当前素数对的距离更小
                    min_diff = n - j - j;       // 更新距离最小值
                    a = j;                 // 更新第一个素数
                    b = n - j;             // 更新第二个素数
                }
            }
        }

        printf("%d %d\n", a, b); // 输出找到的两个素数
    }

    return 0;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

吾乃宇宙欠债王

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值