1.题目:P2404 自然数的拆分问题 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
话不多说,上代码!
#include<stdio.h>
#include<stdlib.h>
int a[10001] = {1}, n;
void search(int s, int t);
void print(int t);
int main()
{
scanf("%d", &n);
search(n, 1); //将要拆分的数n传递给s
return 0;
}
void search(int s, int t)
{
int i;
for (i = a[t - 1]; i <= s; i++)
if (i < n) //当前数i要大于等于前一位数,且不超过n
{
a[t] = i; //保存当前拆分的数i
s -= i; //s减去数i,s的值将继续拆分
if (s == 0)
print(t); //当s=0时,拆分结束输出结果
else
search(s, t + 1); //当s>0时,继续递归
s += i; //回溯:加上拆分的数,以便产生所有可能的拆分
}
}
void print(int t)
{
for (int i = 1; i <= t - 1; i++) //输出一种拆分方案
printf("%d+", a[i]);
printf("%d\n", a[t]);
}
整个思路就是将一个正整数n拆分成若干个正整数之和。程序首先读取一个整数n,然后调用search函数进行拆分。search函数使用递归的方式尝试所有可能的拆分方案,当找到一个满足条件的拆分方案时,调用print函数输出结果。