基础实验2-2.5 整数分解为若干项之和 (20 point(s))
这道题采用递归解法会比较简单。(说实话我不知道为啥实在不怎么会写递归,虽然看起来代码清晰但我脑子其实很乱……)
先给出accept代码:
#include<stdio.h>
#include<iostream>
#include<algorithm>
using namespace std;
int ans[1000] = { 0 };
int index = 0;
int Max = 1;
void problem(int len,int big,int rear) {
if (len == 0) {
printf("%d=", rear);
for (int i = 0; i < index; i++) {
if (i != index - 1)
printf("%d+", ans[i]);
else
printf("%d", ans[i]);
}
if (Max % 4 == 0)
printf("\n");
else {
if(ans[0]!=rear)
printf(";");
}
Max++;
}
for (int i = 1; i <= len; i++) {
if (i >= big) {
ans[index++] = i;
problem(len - i, i,rear);
ans[--index] = 0;
}
}
}
int main() {
int number = 0;
cin >> number;
problem(number,1,number);
return 0;
}
基本思路
- 递归主体的主要思路为:
- 从1开始,第一个分解得出的整数为1。
- 递归调用,参数为目标数减去刚刚分解出来的整数,分解得出的剩下所有整数。
- 擦除刚刚填进去的整数,恢复成没有填的状态。
- 开始分解出的整数递增,继续上述步骤。
- 递归出口为目标数为0,即整数已经分解完成,输出答案。
- 上述写法会出现重复的情况,我们要去重。思路为,当分解出一个整数(我们称为数a),需要分解另一个数(我们称为数b)时,b的值一定要大于等于a的值,否则放弃执行该递归栈。这样就能把重复的情况去掉。
- 关于输出,我们定义一个Max计数,当Max的模为0,换行;当Max的模不为0,输出分号。注意需要特判,最后一个数据输出时不能输出分号
心得
- 查重耗费了我好长时间。因为很久都没有发现,每个整数因子都是递增的,用了很多很蠢的办法都没能很好查重。多审题,多找规律,也许能有助于我完成题目。
- 用递归函数解决问题一直是我的弱项。虽然递归代码清晰但是每次写起来我脑子都是乱的。我觉得我需要总结一下递归的思路,递归出口怎么确定?主体应该怎么写?