PTA基础编程题目集 7-37 整数分解为若干项之和(C语言实现)

摘要:本文针对正整数分解问题,要求按递增顺序输出所有分解式子,并给出了一种基于两次 DFS(深度优先搜索)的 C 语言实现。第一次 DFS 统计方案总数,第二次 DFS 按序输出所有分解结果,同时满足每行最多 4 个式子、分号分隔的输出格式要求。

题目描述

将一个正整数 N 分解成几个正整数相加,可以有多种分解方法,例如 7=6+1,7=5+2,7=5+1+1,......。编程求出正整数 N 的所有整数分解式子。

输入格式:

每个输入包含一个测试用例,即正整数 N (0 < N ≤ 30)。

输出格式:

按递增顺序输出 N 的所有整数分解式子。递增顺序是指:对于两个分解序列 N₁ = {n₁, n₂, ⋯} 和 N₂ = {m₁, m₂, ⋯},若存在 i 使得 n₁ = m₁, ⋯, nᵢ = mᵢ,但是 nᵢ₊₁ < mᵢ₊₁,则 N₁ 序列必定在 N₂ 序列之前输出。每个式子由小到大相加,式子间用分号隔开,且每输出 4 个式子后换行。

输入样例:

复制代码
7

输出样例:

复制代码
7=1+1+1+1+1+1+1;7=1+1+1+1+1+2;7=1+1+1+1+3;7=1+1+1+2+2
7=1+1+1+4;7=1+1+2+3;7=1+1+5;7=1+2+2+2
7=1+2+4;7=1+3+3;7=1+6;7=2+2+3
7=2+5;7=3+4;7=7

代码部分实现

c 复制代码
#include <stdio.h>       // 引入标准输入输出头文件

int N;                  // 全局变量:待分解的正整数
int result[35];         // 全局数组:存储当前分解方案的各项
int count = 0;          // 全局变量:已输出的方案计数
int total = 0;          // 全局变量:方案总数

void dfs_count(int start, int remaining) {  // 深度优先搜索计数函数
    if (remaining == 0) {  // 剩余值为0,找到一种分解方案
        total++;          // 方案总数加1
        return;           // 返回
    }
    for (int i = start; i <= remaining; i++) {  // 从start开始遍历可能的分解值
        dfs_count(i, remaining - i);  // 递归调用,剩余值减去i,起点仍为i保证不减
    }
}

void print_result(int depth) {  // 输出一种分解方案
    printf("%d=%d", N, result[0]);  // 输出N=第一项
    for (int i = 1; i < depth; i++) {  // 遍历剩余各项
        printf("+%d", result[i]);  // 输出+各项
    }
    count++;              // 已输出方案计数加1
    if (count % 4 == 0 || count == total) {  // 每4个方案或最后一个方案
        printf("\n");     // 输出换行
    } else {
        printf(";");      // 输出分号分隔
    }
}

void dfs_print(int start, int remaining, int depth) {  // 深度优先搜索输出函数
    if (remaining == 0) {  // 剩余值为0,找到一种分解方案
        print_result(depth);  // 输出该方案
        return;           // 返回
    }
    for (int i = start; i <= remaining; i++) {  // 从start开始遍历可能的分解值
        result[depth] = i;  // 保存当前分解值到结果数组
        dfs_print(i, remaining - i, depth + 1);  // 递归搜索下一层
    }
}

int main() {
    scanf("%d", &N);      // 读取待分解的正整数N
    dfs_count(1, N);      // 第一遍DFS:统计所有可能的分解方案总数
    count = 0;            // 重置输出计数器
    dfs_print(1, N, 0);   // 第二遍DFS:按要求顺序输出所有分解方案
    return 0;             // 程序正常结束
}

算法流程图

#mermaid-svg-WiY6FHPj8ayKRaXQ{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-WiY6FHPj8ayKRaXQ .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-WiY6FHPj8ayKRaXQ .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-WiY6FHPj8ayKRaXQ .error-icon{fill:#552222;}#mermaid-svg-WiY6FHPj8ayKRaXQ .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-WiY6FHPj8ayKRaXQ .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-WiY6FHPj8ayKRaXQ .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-WiY6FHPj8ayKRaXQ .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-WiY6FHPj8ayKRaXQ .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-WiY6FHPj8ayKRaXQ .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-WiY6FHPj8ayKRaXQ .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-WiY6FHPj8ayKRaXQ .marker{fill:#333333;stroke:#333333;}#mermaid-svg-WiY6FHPj8ayKRaXQ .marker.cross{stroke:#333333;}#mermaid-svg-WiY6FHPj8ayKRaXQ svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-WiY6FHPj8ayKRaXQ p{margin:0;}#mermaid-svg-WiY6FHPj8ayKRaXQ .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-WiY6FHPj8ayKRaXQ .cluster-label text{fill:#333;}#mermaid-svg-WiY6FHPj8ayKRaXQ .cluster-label span{color:#333;}#mermaid-svg-WiY6FHPj8ayKRaXQ .cluster-label span p{background-color:transparent;}#mermaid-svg-WiY6FHPj8ayKRaXQ .label text,#mermaid-svg-WiY6FHPj8ayKRaXQ span{fill:#333;color:#333;}#mermaid-svg-WiY6FHPj8ayKRaXQ .node rect,#mermaid-svg-WiY6FHPj8ayKRaXQ .node circle,#mermaid-svg-WiY6FHPj8ayKRaXQ .node ellipse,#mermaid-svg-WiY6FHPj8ayKRaXQ .node polygon,#mermaid-svg-WiY6FHPj8ayKRaXQ .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-WiY6FHPj8ayKRaXQ .rough-node .label text,#mermaid-svg-WiY6FHPj8ayKRaXQ .node .label text,#mermaid-svg-WiY6FHPj8ayKRaXQ .image-shape .label,#mermaid-svg-WiY6FHPj8ayKRaXQ .icon-shape .label{text-anchor:middle;}#mermaid-svg-WiY6FHPj8ayKRaXQ .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-WiY6FHPj8ayKRaXQ .rough-node .label,#mermaid-svg-WiY6FHPj8ayKRaXQ .node .label,#mermaid-svg-WiY6FHPj8ayKRaXQ .image-shape .label,#mermaid-svg-WiY6FHPj8ayKRaXQ .icon-shape .label{text-align:center;}#mermaid-svg-WiY6FHPj8ayKRaXQ .node.clickable{cursor:pointer;}#mermaid-svg-WiY6FHPj8ayKRaXQ .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-WiY6FHPj8ayKRaXQ .arrowheadPath{fill:#333333;}#mermaid-svg-WiY6FHPj8ayKRaXQ .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-WiY6FHPj8ayKRaXQ .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-WiY6FHPj8ayKRaXQ .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-WiY6FHPj8ayKRaXQ .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-WiY6FHPj8ayKRaXQ .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-WiY6FHPj8ayKRaXQ .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-WiY6FHPj8ayKRaXQ .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-WiY6FHPj8ayKRaXQ .cluster text{fill:#333;}#mermaid-svg-WiY6FHPj8ayKRaXQ .cluster span{color:#333;}#mermaid-svg-WiY6FHPj8ayKRaXQ div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-WiY6FHPj8ayKRaXQ .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-WiY6FHPj8ayKRaXQ rect.text{fill:none;stroke-width:0;}#mermaid-svg-WiY6FHPj8ayKRaXQ .icon-shape,#mermaid-svg-WiY6FHPj8ayKRaXQ .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-WiY6FHPj8ayKRaXQ .icon-shape p,#mermaid-svg-WiY6FHPj8ayKRaXQ .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-WiY6FHPj8ayKRaXQ .icon-shape .label rect,#mermaid-svg-WiY6FHPj8ayKRaXQ .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-WiY6FHPj8ayKRaXQ .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-WiY6FHPj8ayKRaXQ .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-WiY6FHPj8ayKRaXQ :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 是

main() 入口
scanf 读取 N
dfs_count(1, N)
统计 total(方案总数)
count = 0 重置计数器
dfs_print(1, N, 0)
remaining == 0?
调用 print_result(depth) 输出
返回
for i = start to remaining
resultdepth = i
dfs_print(i, remaining - i, depth + 1)
程序结束

相关推荐
long3161 小时前
PostgreSQL 学习资料 · 入门 / 练习 / 精通 / 扩展
java·数据结构·数据库·spring boot·sql·postgresql·数据库开发
运维大师1 小时前
【K8S 运维实战】31-Helm包管理
运维·算法·kubernetes
烬羽2 小时前
一个队列,怎么让滑动窗口从 O(nk) 变 O(n)?单调队列彻底搞懂
javascript·数据结构·算法
末代iOS程序员华仔2 小时前
OPC + Flutter + Swift:跨平台应用上架与专业知识点获客实战指南
开发语言·flutter·swift
脚踏实地皮皮晨2 小时前
003004002_UniformGrid控件的使用方法
开发语言·c#·.net·wpf·visual studio
XH华2 小时前
C++语言第四章:模板初阶
数据结构·c++·算法
纳兰青华2 小时前
拼图大师:从“暴力尝试“到“动态规划“的拆字艺术
java·算法·动态规划
星马梦缘2 小时前
算法设计导论 课堂笔记
算法·动态规划·分治·时间复杂度·最优二叉树
j7~3 小时前
【Linux】二十六.线程篇三《Linux多线程编程:线程控制、线程ID以及进程地址空间分布、线程局部存储__thread以及clone系统调用》---详解
linux·运维·服务器·开发语言·c++·多线程编辑·线程的控制