内存:1000  时间:1

题目描述

题目:输入两个整数 m n,从数列123…….n 随意取几个数,
使其和等于 m ,要求将其中所有的可能组合列出来.

输入

输入:6

输出

输出:

6

5 1

4 2

3 2 1

样例输入

6

样例输出

6

5 1

4 2

3 2 1

提示

代码如下

#include<stdio.h>   
#include<malloc.h> 
#include<string.h> 
#define SEN 100   
      
struct sqstack   
{   
    char *base;   
    char *top;   
    int size;   
};   
      
struct sqstack *initEmptyStack()   /*构建空輚*/
{   
    struct sqstack *p;   
    p=(struct sqstack *)malloc(sizeof(struct sqstack));   
    if(p!=NULL)   
    {   
        p->base=(char *)malloc(sizeof(struct sqstack)*SEN);   
        if(p->base!=NULL)   
        {   
            p->top=p->base;   
            p->size=SEN;   
            return p;   
        }   
    }   
    else
        free(p);   
    return NULL;   
}   
      
int push(struct sqstack *p,int a)         /*入栈*/
{   
    *p->top++=a;   
    return 0;   
}   
      
int gettop(struct sqstack *p)             /*取栈顶元素*/
{  
    if(p->base!=p->top)  
        return *(p->top-1);  
    return 0; 
} 


int pop(struct sqstack *p)              /*出栈*/
{   
    return *(--p->top);   
}   
      
int main()   
{    
    struct sqstack *p1,*p2,*p3;
	int m,t=1,a,sum,n;
	scanf("%d",&m);
	p1=initEmptyStack();
	p2=initEmptyStack();
	p3=initEmptyStack();
	printf("%d\n\n",m);
	n=m;
	m--;
	while(m--)
	{
		sum=0;
		t=1;
		do{
			push(p1,t);
				t++;
		}while(t<=m+1);
		while(p1->base!=p1->top)
		{
			a=pop(p1);
			sum+=a;
			if(sum>n)
				sum-=a;
			else if(sum==n)
			{
				while(p2->base!=p2->top)
					push(p3,pop(p2));
				while(p3->base!=p3->top)
					printf("%d ",pop(p3));
				printf("%d\n\n",a);
				sum-=a;
			}
			else
				push(p2,a);
		}
		while(p2->base!=p2->top)
			pop(p2);
	}
	return 0;
}

代码来源于互联网,仅供参考!