/*
编程求解:输入两个整数 n 和 m,从数列 1,2,3.......n 中随意取几个数,使其和等于m ,要求将其中所有的可能组合列出来。
*/
#include <stdio.h>
int j = 0;//标志位,确保输出结果格式
//输出函数,map为输出数列,len为map长度
void print(int *map,int len)
{
int i;
if(j == 0)//确保输出格式正确
{
printf("\n");
j=map[0];
}
else
{
if(j != map[0])
{
printf("\n");
j=map[0];
}
else
printf(",");
}
printf("%d",map[0]);
for( i = 1 ; i < len ; i++ )
printf("+%d",map[i]);
}
//map为输出数列,len为map长度
void f(int n,int m,int *map,int len)
{
if( (n*(n+1)) < (2*m))
{
return;
}
else if( n == 1 && m == 1 )
{
map[len] = 1;
print(map,len+1);
}
else if( n == 1 && m > 1)
{
return;
}
else if( n > m )
f(m,m,map,len);
else if( n == m )
{
map[len] = n;
if(map[len] != map[len-1])
print(map,len+1);
f(n-1,m,map,len);
}
else
{
map[len]=n;
if(map[len] != map[len-1])
f(n,m-n,map,len+1);
f(n-1,m,map,len);
}
}
void main()
{
int n,m;
int map[1024]={0};
int len=0;
printf("请输入整数和M:\n");
scanf("%d",&m);
printf("请输入整数N:\n");
scanf("%d",&n);
printf("m=%d\tn=%d\n",m,n);
if( (n*(n+1)) < (2*m))
{
printf("无解\n");
return;
}
f(n,m,map,len);
printf("\n");
}
1到n之间几个数的和为m
最新推荐文章于 2021-06-15 19:21:26 发布