数的组合【数组】

数的组合【数组】

时间: 1ms        内存:128M

描述:

设整数x1,x2,,xN已存放在数组A中,编写一递归过程,输出从这n个数中取出所有k 个数的所有组合(k<=n)。例:若A中存放的数是12345k3,则输出结果应为:543542541532531521432431421321

输入:

1 2 3 4 5

3

输出:

543542541532531521432431421321

示例输入:

5 6 1 2 9 5
4

示例输出:

5921,5926,5925,5916,5915,5965,5216,5215,5265,5165,9216,9215,9265,9165,2165

提示:

参考答案(内存最优[1092]):

#include <stdio.h>
#include <stdlib.h>
int a[100],b[100];
int t=0;
void combine(int n,int k,int K)
{
    int i,j;
	for(i=n;i>=k;i--){
		b[k-1]=i-1;
		if(k>1)
			combine(i-1,k-1,K);
		else
		{
			if(t!=0)
			{
				printf(",");
			}
			t++;
			for(j=K-1;j>=0;j--)
			{
				printf("%d",a[b[j]]);
			}
		}
	}
	
    
}
int main()
{
	
    int sum=1,i,m=0,n=0,k,K;
    while(1)
    {
    	scanf("%d",&a[n++]);
		if(getchar()=='\n')
    		break;
    }
                                             
   	scanf("%d",&k);
   	K=k;
	combine(n,k,K);											
    return 0;
}

参考答案(时间最优[0]):

#include <stdio.h>
void combine(int a[], int n, int m, int b[], int M);
int t=0;
int main(void)
{
    int i=0,k;
    int a[100], b[100];
    char ch;
    for(i;; i++)
    {
        scanf("%d%c",&a[i],&ch);
        if(ch=='\n') break;
    }
    scanf("%d",&k);

    combine(a, i+1, k, b, k);
    return 0;
}
void combine(int a[], int n, int m, int b[], int M)
{
    int i, j;
    for (i = n; i >= m; i--)
    {
        b[m - 1] = i - 1;
        if (m > 1)
            combine(a, i - 1, m - 1, b, M);
        else
        {
            if(t!=0)
            {
                printf(",");
            }
            t++;
            for (j = M - 1; j >= 0; j--)
                printf("%d", a[b[j]]);

        }
    }
}

题目和答案均来自于互联网,仅供参考,如有问题请联系管理员修改或删除。

点赞

发表评论

电子邮件地址不会被公开。必填项已用 * 标注