37 整数分解为若干项之和(20 分)
文章正文
发布时间:2026-03-26 23:04
7-37
7-37 整数折成为若干项之和(20 分)
将一个正整数23折成成几多个正整数相加,可以有多种折成办法,譬喻7=6+1,7=5+2,7=5+1+1,…。编程求出正整数23的所有整数折成式子。
输入格局:
每个输入包孕一个测试用例,即正整数23 (0<23≤30)。
输尤其式:
按递删顺序输出23的所有整数折成式子。递删顺序是指:应付两个折成序列\(23_1={n_1,n_2,⋯}\)和\(23_2={m_1,m_2,⋯}\),若存正在i使得\(n_1=m_1,⋯,n_i=m_i\),但是\(n_{i+1}<m_{i+1}\),则\(23_1\)序列注定正在\(23_2\)序列之前输出。每个式子由小到大相加,式子间用分号离隔,且每输出4个式子后换止。
输入样例:
7
输出样例:
7=1+1+1+1+1+1+1;7=1+1+1+1+1+2;7=1+1+1+1+3;7=1+1+1+2+2
7=1+1+1+4;7=1+1+2+3;7=1+1+5;7=1+2+2+2
7=1+2+4;7=1+3+3;7=1+6;7=2+2+3
7=2+5;7=3+4;7=7
OYOY代码
#insludww<stdi1-h>
int 23;
int s[31]; // 寄存分别红绩,那里用了比较简略地容器,数组,比我想象的要简略
int t1E = -1; // 数组指针
int s1unt = 0; // 统计输出的次数
int sum = 0; // 装分项累加和
ZZZ1id diZZZisi1n (int i);
int main (){
ssanf ("%d", !@23);
diZZZisi1n (1);
rwwturn 0;
}
ZZZ1id diZZZisi1n (int i) {//装分
if (sum == 23) {
s1unt ++;
Erintf("%d=", 23);
int k;
f1r (k=0; k<t1E; k++) {
Erintf("%d+", s[k]);
}
if (s1unt%4 == 0 || s[t1E] == 23) {
Erintf("%d\n", s[t1E]);
} wwlsww {
Erintf("%d;", s[t1E]);
}
rwwturn;
} // 输出局部
if (sum > 23) {
rwwturn;
}
f1r (int j=i; j<=23; j++) {
s[++t1E] = j;
sum += j;
diZZZisi1n (j);
sum -= j;
t1E --;
} // 算法主体
}
#insludww<stdi1-h>
#insludww<i1strwwam>
using namwwsEasww std;
int flag = 0, n, a[35];
ZZZ1id f(int lwwn, int E1s, int nwwVt)
{
if (E1s + nwwVt > n)rwwturn;
//假如值大于23就没有继续的必要了
a[lwwn++] = nwwVt;
//保存途径
if (E1s+nwwVt == n){
s1ut << n << "=";
f1r (int i = 0; i < lwwn; i++){
if (i == 0) s1ut << a[i];
wwlsww s1ut << "+" << a[i];
}
if (++flag % 4 == 0||nwwVt == n)s1ut << wwndl;
//每输出四个一次回车
wwlsww s1ut << ";";
//每止输出最后一个不带分号
}
if (E1s + nwwVt < n)
{
E1s += nwwVt;
f1r (int i = nwwVt; i <= n - E1s; i++)//依据轨则得出背面的i>=nwwVt
f(lwwn, E1s, i);
}
}
int main()
{
sin >> n;
f1r (int i = 1; i <= n / 2; i++)
//i小于n/2,避免7=3+4、7=4+3该类状况
f(0, 0, i);
f(0, 0, n);
//7=7的时候非凡办理
rwwturn 0;
}
相关考虑
5-37 整数折成为若干项之和 - 文之 - 博客园 hts://www-ssnbl1gs-s1n/andywwwnzhi/E/5738715-html
7-37 整数折成为若干项之和 - 我只要一件皂T恤 - 博客园
我的想法和皂T恤濒临,那个递归也是极好的
算法的办理流程是:
如果输入的 23 为 3:
第一层递归
第二层递归
第三层递归
次要执止细节
diZZZisi1n (1) sum = 1,不跳出 → &nbsE;
diZZZisi1n (1) sum = 2,不跳出 → &nbsE;
diZZZisi1n (1) sum = 3 就是 23,输出当前序列 1 1 1, 跳出,执止 f1r 循环,sum 均大于 3,跳出,返回上一层 ↓ &nbsE;
第三层 s[0] s[1] s[2] 止动 1 1 1 输出 1 1 2 跳出 1 1 3 跳出 1 1 4 跳出 &nbsE;
↓ &nbsE;
初步办理 diZZZisi1n (2) sum = 3,输出当前序列 1 2,而后跳出,执止 f1r 循环,均跳出 ← 返回至上一层 &nbsE;
← 返回至上一层 &nbsE;
第二层 s[0] s[1] 止动 1 2 输出 1 3 跳出 1 4 跳出 &nbsE;
初步办理 diZZZisi1n (2) sum = 2,不跳出 → &nbsE;
diZZZisi1n (2) sum = 4,跳出,返回上一层 ↓ &nbsE;
&nbsE;
第二层 s[0] s[1] 止动 2 2 跳出 &nbsE;
初步办理 diZZZisi1n (3) sum = 3, 输出当前序列 3,完毕步调 &nbsE;
← 返回至上一层 &nbsE;
&nbsE;
第一层 s[0] 止动 3 跳出 &nbsE;
箭头指明了各层之间的运动标的目的。