1.3.2 自然数拆分问题(C++实现)

题目叙述

任何一个大于1的自然数n,总可以拆分成若干个小于n的自然数之和。现在给你一个自然数n,要求你求出n的拆分成一些数字的和。每个拆分后的序列中的数字从小到大排序。然后你需要输出这些序列,其中字典序小的序列需要优先输出。

输入

第一行为一个整数n。

输出

若干数的加法式子。

样例输入 1

7

样例输出 1

1+1+1+1+1+1+1
1+1+1+1+1+2
1+1+1+1+3
1+1+1+2+2
1+1+1+4
1+1+2+3
1+1+5
1+2+2+2
1+2+4
1+3+3
1+6
2+2+3
2+5
3+4

提示

1 ≤ n ≤ 8 1 \le n \le 8 1n8

实现思路

填写代码中的三个 objective 即可。

  • objective 1:

    递归前的处理,将 n(表示还剩下多少值没有用) 减去当前的 i 值即可。

  • objective 2:

    把 i 加回去。

  • objective 3:

    题目的意思是,输出的加法式子中必须含有 + 号,

    所以判断条件就是 如果 top == 1 就直接返回,不输出。

实现代码(C++)

#include<iostream>

int n, top; // n,保存当前n所剩没有加过的值,然后对当前所剩数进行搜索
int line[100];

void func(int last) {
	if (n == 0) {
		/*---------objective 3 begin-------*/ 
		if (top == 1) {
			return ;
		}
        /*---------objective 3 end---------*/
		printf("%d", line[1]);
		for (int i = 2; i <= top; i++) {
			printf("+%d", line[i]);
		}
		printf("\n");
		return ;
	}

	for (int i = last; i <= n; i++) {
		top++;
		line[top] = i;
		/*---------objective 1 begin-------*/
		n -= i;
        /*---------objective 1 end---------*/
		func(i);
		/*---------objective 2 begin-------*/
		n += i;
        /*---------objective 2 end---------*/
		top--;
	}

	return ;
}

int main() {
	scanf("%d", &n);
	top = 0;
	func(1);
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值