1259: 【基础】哥德巴赫猜想的所有解

题目描述

求出哥德巴赫猜想的所有解(将一个大于9的奇数拆分成三个素数之和),并按从小到大的顺序写出。

输入

一行,一个大于9的奇数。

输出

第一行,一个整数N,表示解的总数。 第2-N+1行,每行一个解。

样例输入

复制

15
样例输出

复制

3
15=2+2+11
15=3+5+7
15=5+5+5

 最终优化代码
 

#include 
#define N 100
using namespace std;

int p[N], sol[N][3], cnt, n;

void init() {
    memset(p, 1, sizeof(p));
    p[0] = p[1] = 0;
    for(int i=2; i> n;
    
    for(int a=2; a<=n/3; a++) if(p[a])
        for(int b=a; b<=(n-a)/2; b++) if(p[b]) {
            int c = n-a-b;
            if(c >= b && p[c]) {
                sol[cnt][0]=a, sol[cnt][1]=b, sol[cnt][2]=c;
                cnt++;
            }
        }
    
    cout << cnt << "\n";
    for(int i=0; i

代码说明:

  1. 全局定义

    • #define N 100 定义足够大的素数范围

    • int p[N] 素数标记数组(1表示素数,0表示非素数)

    • int sol[N][3] 存储解的二维数组

    • int cnt 解的数量计数器

    • int n 输入的奇数

  2. 素数筛法

    • init()函数初始化素数表

    • 使用埃拉托斯特尼筛法标记非素数

    • 时间复杂度O(N log log N)

  3. 主逻辑

    • 双重循环枚举素数组合:

      • 外层循环a从2到n/3

      • 内层循环b从a到(n-a)/2

      • 计算c = n - a - b

    • 检查c是否满足条件:c ≥ b且c是素数

  4. 输出处理

    • 先输出解的数量

    • 然后按顺序输出每个解

优化特点:

  1. 完全使用数组

    • 不使用vector和结构体

    • 使用二维数组存储解

  2. 代码精简

    • 使用万能头文件

    • 变量名简洁

    • 逻辑紧凑

  3. 效率优化

    • 预处理素数表

    • 循环范围优化

复杂度分析:

  • 时间复杂度:O(N log log N)预处理 + O(n²)枚举 ≈ O(n²)

  • 空间复杂度:O(N) ≈ 100字节

你可能感兴趣的:(算法)