33,028
社区成员
发帖
与我相关
我的任务
分享
#include <stdio.h>
#include <string.h>
/**
* 把n为解为和式中最大值不超过k的和的形式,其中m<=n,
* 表示n中还剩余的没有分出去的值,和形式中至少有一个k
*/
void getSum(int n, int m, int k, char *str, int rightNum)
{
char outPut[1024];
char temp[20];
int loop;
if(n == m) {
sprintf(outPut, "%d = ", n);
} else {
strcpy(outPut, str);
}
if(m == k) {
printf("%s", outPut);
if(rightNum > 0) printf(" + ");
printf("%d\n", k);
} else {
if(rightNum > 0){
sprintf(temp, " + ");
strcat(outPut, temp);
}
sprintf(temp, "%d", k);
strcat(outPut, temp);
if(m - k >= k) getSum(n, m - k, k, outPut, rightNum + 1);//优先考虑有多个k的情形
loop = (m - k) >= k ? (k - 1) : (m - k);//接着考虑至少有一个k的情形
for(; loop >= 1; loop--) {
getSum(n, m - k, loop, outPut, rightNum + 1);
}
}
}
int main()
{
int n;
int loop;
char outPut[1024]={'\0'};
scanf("%d", &n);
for(loop = n; loop >= 1; loop--) {
//如果分解的和形式不包括n = n,这里初始化的时候改成loop = n - 1即可
getSum(n, n, loop, outPut, 0);
}
return 0;
}