一、输入一个正整数,输出所有可能的加法组合
代码如下:
#include <stdio.h>
void split(int n, int a, int* arr, int log)
{ int i;
// 如果n为0,则打印当前组合
if (n==0)
{ for (i=0; i<log; i++)
{
if (i>0) printf(" + ");
printf("%d", arr[i]);
}
printf("\n");
return;
}
// 从a到n递增进行拆分
for (int i=a; i<=n; i++) {
// 递归处理剩余部分
if (i<=n)
{ arr[log]=i;
split(n-i, i, arr, log+1); // 继续将i作为下一个数的起点a
}
}
}
int main() {
int n;
int arr[10]; // 储存拆分组合
printf("输入一个正整数:");
scanf("%d",&n);
split(n, 1, arr, 0); // 拆分从1开始
return 0;
}
二、输入一个正整数,输出所有可能的乘法组合
代码如下:
#include <stdio.h>
void split(int n, int a, int* arr, int log)
{ int i;
// 如果n为0,则打印当前组合
if (n==1)
{ for (i=0; i<log; i++)
{
if (i>0) printf(" * ");
printf("%d", arr[i]);
}
printf("\n");
return;
}
for (int i=a; i*i<=n; i++) { // 范围从a到n/a
if(n%i==0) { // 找因子
arr[log]=i;
split(n/i, i, arr, log+1);
if (i!=n/i) // 若n不是平方数,还要进行递归
{ int t=n/i;
arr[log]=t;
split(t, a, arr, log+1); // n/i为下一个因子的起点
}
}
}
}
int main() {
int n;
int arr[100]; // 储存拆分组合
printf("输入一个正整数:");
scanf("%d",&n);
split(n, 2, arr, 0); // 拆分从2开始,去掉1*n组合
return 0;
}