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;
}
相关推荐
编程大师哥12 小时前
C++类和对象
开发语言·c++·算法
加农炮手Jinx12 小时前
LeetCode 146. LRU Cache 题解
算法·leetcode·力扣
Rabitebla12 小时前
C++ 和 C 语言实现 Stack 对比
c语言·数据结构·c++·算法·排序算法
加农炮手Jinx12 小时前
LeetCode 128. Longest Consecutive Sequence 题解
算法·leetcode·力扣
旖-旎12 小时前
递归(汉诺塔问题)(1)
c++·学习·算法·leetcode·深度优先·递归
深邃-12 小时前
【数据结构与算法】-顺序表链表经典算法
java·c语言·数据结构·c++·算法·链表·html5
努力学习的小廉12 小时前
我爱学算法之—— 前缀和(上)
c++·算法
AC178012 小时前
深入浅出 PID 算法:原理、实现与应用实战
人工智能·算法·机器学习
就爱学编程12 小时前
惊叹数据结构之美,品味排序算法之妙:对计排、桶排的详细介绍
数据结构·算法·排序算法
啊我不会诶12 小时前
2025CCPC福建邀请赛补题
算法·深度优先