基础实验2-2.5 整数分解为若干项之和 (20 point(s)) 笔记

基础实验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开始,第一个分解得出的整数为1。
    • 递归调用,参数为目标数减去刚刚分解出来的整数,分解得出的剩下所有整数。
    • 擦除刚刚填进去的整数,恢复成没有填的状态。
    • 开始分解出的整数递增,继续上述步骤。
  2. 递归出口为目标数为0,即整数已经分解完成,输出答案。
  3. 上述写法会出现重复的情况,我们要去重。思路为,当分解出一个整数(我们称为数a),需要分解另一个数(我们称为数b)时,b的值一定要大于等于a的值,否则放弃执行该递归栈。这样就能把重复的情况去掉。
  4. 关于输出,我们定义一个Max计数,当Max的模为0,换行;当Max的模不为0,输出分号。注意需要特判,最后一个数据输出时不能输出分号

心得

  1. 查重耗费了我好长时间。因为很久都没有发现,每个整数因子都是递增的,用了很多很蠢的办法都没能很好查重。多审题,多找规律,也许能有助于我完成题目。
  2. 用递归函数解决问题一直是我的弱项。虽然递归代码清晰但是每次写起来我脑子都是乱的。我觉得我需要总结一下递归的思路,递归出口怎么确定?主体应该怎么写?

Roman wasn’t built in a day.Just do it!

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值