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;
}