OJ笔记 18713 整数的分解

18713 整数的分解

Description
输出一个正整数n的分解形式。例如,当n=4时,输出:
4=4
4=3+1
4=2+2
4=2+1+1
4=1+1+1+1
共计 5 种形式。
当n=7时,共有15种形式。
当n=10时,共有42种形式。

输入格式
一个整数n(1<=n<=10)。

输出格式
n的全部分解形式,注意分解式中数字值大的排在前面,如第一个数字值相同,那么比较第二个数字。

输入样例
4

输出样例
4=4
4=3+1
4=2+2
4=2+1+1
4=1+1+1+1

递归:

思路:要拆分整数n,肯定先要找到一个元素,然后我们会发现,剩下的问题还是一个整数分解问题,因此容易得到问题的解。
定义函数 f(n) 为 n 可以拆分的解的个数,即可以先拆分出一个数字k ( k = 1,2,……,n),然后再拆分 f(k) ,即有:
n = n+f(0);
n = (n-1)+f(1);
……
n = 2+f(n-2);
n = 1+f(n-1)

#include <iostream>
#include <cstdio>

using namespace std;

int n,a[15];//数组存放加数

void Fen(int rest,int k) //rest:开头的加数,k:加数数组索引(大小)
{
    //递归出口
    if(rest == 0){
        printf("%d=",n);
        for(int i = 0;i < k - 1;i++){
            cout << a[i] << "+";//输出加数
        }
        cout << a[k-1] << endl;//输出加数,完成一条式子
        return;
    }
    for(int i = rest;i > 0;i--){ //加数递减
        if(k == 0 || i <= a[k - 1]) //结尾的加数=0,n=本身 || reat要比上一个加数小
        {
            a[k] = i;//存入加数(从大到小)
            Fen(rest - i,k + 1);
        }
    }
}

int main()
{

    scanf("%d",&n);
    Fen(n,0);

    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值