这是我今天听到的一道题,感觉很有意思,和大家分享一下,核心思想是递归和不降序组合。话不多说,直接上代码。
#include<stdio.h>
//begin是开头的数字,end是剩余数字想要得到的和,同时begin和end也指定了选取数字的区域范围
//size是当前arr数组中储存的数据的个数
//arr为储存数组的地址
void number(int begin, int end, int size, int* arr)
{
int i = 0;
int j = 0;
for (i = begin + 1; i <= end; i++)
{
if (begin < end)//过滤无效的循环,加快计算速度
{
arr[size] = i;
//当前储存的数等于end(最后想要得到的数)时,开始打印
if (i == end)
{
for (j = 0; j <= size; j++)
{
printf("%d ", arr[j]);
}
printf("\n");
return;
}
//当前储存的数不等于end(最后想要得到的数)时,寻找下一个数
if (1 < (end - i))//过滤无效的递归,加快计算速度
{
number(i, end - i, size + 1, arr);
}
}
}
return;
}
int main()
{
int nums = 0;
int input = 0;
int i = 0;
int j = 0;
int arr[100] = { 0 };//储存数字组合
input = 100;
//过滤是100本身的情况
printf("100 \n");
//1到100开头时的数字组合
for (j = 1;j <= input;j++)
{
arr[0] = j;//储存第一个数字
number(j, input - j, 1, arr);
}
return 0;
}
大家可以对照注释,挑战一下。我的代码也有可能有问题,也希望大佬指正。