P1304 哥德巴赫猜想

题目描述

输入一个偶数 N N N,验证 4 ∼ N 4\sim N 4∼N 所有偶数是否符合哥德巴赫猜想:任一大于 2 2 2 的偶数都可写成两个质数之和。如果一个数不止一种分法,则输出第一个加数相比其他分法最小的方案。例如 10 10 10, 10 = 3 + 7 = 5 + 5 10=3+7=5+5 10=3+7=5+5,则 10 = 5 + 5 10=5+5 10=5+5 是错误答案。

输入格式

第一行输入一个正偶数 N N N

输出格式

输出 N − 2 2 \dfrac{N-2}{2} 2N−2 行。对于第 i i i 行:

首先先输出正偶数 2 i + 2 2i+2 2i+2,然后输出等号,再输出加和为 2 i + 2 2i+2 2i+2 且第一个加数最小的两个质数,以加号隔开。

样例 #1

样例输入 #1

复制代码
10

样例输出 #1

复制代码
4=2+2
6=3+3
8=3+5
10=3+7

提示

数据保证, 4 \\leq N\\leq10000

1.题目分析

输入一个偶数,代表右边界,从4到有边界遍历每一个偶数,输出每一个偶数的两个质数之和,保证左边的质数最小化。

说一下质数的判断方法:不能够被1以外的任何自身的因子整除。

2.题目思路

写一个判断质数的函数,输入N,写一个数组存储N以内的所有质数,

用一个三层循环,第一层代表4到N的偶数,第二层代表第一个质数的遍历,第三层代表第二个质数的遍历,

然后判断偶数等于两个质数之和的情况,打印即可。

值得一提的是,第一个质数应该小于第二个质数,

遍历到一组和的时候,需要直接结束本轮最外部的偶数循环。

3.代码实现

c 复制代码
#include <stdio.h>
#include <math.h>

//判断质数的函数
int isPrimer(int n) {
    int flag = 1;
    //对1和0进行特判
    if (n == 1 || n == 0) {
        flag = 0;
    }
    for (int i = 2; i <= sqrt(n); ++i) {
        if (n % i == 0) {
            //可以被自身整除则不为质数
            flag = 0;
        }
    }
    return flag;
}

int main() {
    int n;
    scanf("%d", &n);
    //存放n以内所有的质数
    int arr[n];
    int cnt = 0;
    for (int j = 2; j < n; ++j) {
        //存放质数
        if (isPrimer(j) == 1) {
            arr[cnt] = j;
            cnt++;
        }
    }
    //跳出内部循环的标记
    int flag = 1;
    //遍历偶数
    for (int i = 4; i <= n; i += 2) {
        for (int j = 0; j < cnt; ++j) {
            flag = 1;
            for (int k = j; k < cnt; ++k) {
                //判断质数之和等于偶数
                if (arr[j] + arr[k] == i) {
                    printf("%d=%d+%d\n", i, arr[j], arr[k]);
                    flag = 0;
                }
            }
            //当本轮偶数找到质数和之时,跳出本轮
            if (flag == 0) {
                break;
            }
        }
    }
    return 0;
}
相关推荐
艾莉丝努力练剑26 分钟前
【LeetCode&数据结构】单链表的应用——反转链表问题、链表的中间节点问题详解
c语言·开发语言·数据结构·学习·算法·leetcode·链表
_殊途2 小时前
《Java HashMap底层原理全解析(源码+性能+面试)》
java·数据结构·算法
珊瑚里的鱼5 小时前
LeetCode 692题解 | 前K个高频单词
开发语言·c++·算法·leetcode·职场和发展·学习方法
不知道叫什么呀6 小时前
【C】vector和array的区别
java·c语言·开发语言·aigc
秋说6 小时前
【PTA数据结构 | C语言版】顺序队列的3个操作
c语言·数据结构·算法
lifallen7 小时前
Kafka 时间轮深度解析:如何O(1)处理定时任务
java·数据结构·分布式·后端·算法·kafka
liupenglove7 小时前
自动驾驶数据仓库:时间片合并算法。
大数据·数据仓库·算法·elasticsearch·自动驾驶
python_tty8 小时前
排序算法(二):插入排序
算法·排序算法
然我8 小时前
面试官:如何判断元素是否出现过?我:三种哈希方法任你选
前端·javascript·算法
F_D_Z9 小时前
【EM算法】三硬币模型
算法·机器学习·概率论·em算法·极大似然估计