// // Created by ZhiNian on 2019/3/27. // /* 题目:将一个整数划分为多个整数想加的形式,并输出有所划分方法。 例:6的划分: 6=5+1 6=4+2 6=4+1+1 6=3+3 6=3+2+1 6=3+1+1+1 6=2+2+2 6=2+2+1+1 6=2+1+1+1+1 6=1+1+1+1+1+1 */
#include<stdio.h>
int d[100]; //用来存放分解结果 int ans = 0; //用来存放划分的次数 int N = 0; //定义全局N为了记录下需要划分的值
voiddivide(int m, int n, int k){ //m的n划分,k记录数组所处位置 int i; if (m == 0) { //当m为0时,得到一个划分,将分解结果输出 ans++; //得出一个划分即自增计数 printf("%d=%d", N, d[0]); //输入格式为 N=第一个数 因为第一个数的前面不能是加号 for (i = 1; i < k; i++) //循环输出 printf("+%d", d[i]); //依次输出之后的数 printf("\n"); //满足一组后换行 } for (i = (m < n ? m : n); i > 0; i--) { //把最小值给i d[k] = (i < n ? i : n); //把最小的值给d[k]存入数组然后再划分 divide(m - d[k], d[k], k + 1); //递归调用使分解继续下去,直到得到一个划分 } }
intmain(){ int n; //声明接收的值 scanf("%d", &n); //接收需要划分的值 N = n; //保留需要划分的值 divide(n, n, 0); //传入划分 printf("The number of \"Divide the number :%d \" is %d.\n", n, ans); //输出计数结果 return0; }
//now记录数组当前长度,k记录递归深度, pre记录前一个的值 voiddivide(int now, int k, int pre){ int i; //数组长度大于n就返回 if (now > n) return; if (now == n) {//输出一个情况 ans++; printf("%d=", n); for (i = 0; i < k - 1; i++) { printf("%d+", mark[i]); } printf("%d\n", mark[i]); } else {//if (now < n) for (i = pre; i > 0; i--) { //从前一个数值一直到1 if (i <= pre) {//当i小于等于前一个数值时,就是从最大的划分开始一直找到1为止,此时now==n 即可输出 mark[k] = i; now = now + i; divide(now, k + 1, i); now = now - i; } } } }
intequationCount(int n, int m){ if (n == 1 || m == 1) return1; elseif (n < m) return equationCount(n, n); elseif (n == m) return1 + equationCount(n, n - 1); else return equationCount(n, m - 1) + equationCount(n - m, m); }
intmain(void){ int n; while (scanf("%d", &n) != EOF && (n >= 1 && n <= 120)) { printf("%d\n", equationCount(n, n)); } return0; }