摘要:本文针对正整数分解问题,要求按递增顺序输出所有分解式子,并给出了一种基于两次 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)
程序结束