关于#c语言#的问题:20个规定数选7数为一个数组

有20个规定的数{3.5.11.13.17.18.20.26.33.35.46.49.51.56.58.63.65.71.73.76},输出7个数为一个数组,7个数不能重复,输出全部组的结果



#include<stdio.h>
int temp[7] = { 0 };
int j = 0;
int count = 0;
void show(int* arr,int i)
{
    //选中了7个就输出,并结束,计数加1
    if (j == 7)
    {
        int k;
        for (k = 0; k < 7; k++)
        {
            printf("%d ", temp[k]);
        }
        count++;
        printf("\n");
        return;
    }

    //剩下的元素不够拼成7个数
    if (20-i<7-j)return;
    //放入第i个元素
    temp[j] = arr[i];
    i++, j++;
    show(arr, i);
    //不放第i个元素
    j--;
    show(arr, i);
}
int main()
{
    int arr[] = { 3,5,11,13,17,18,20,26,33,35,46,49,51,56,58,63,65,71,73,76 };
    show(arr, 0);
    printf("一共%d", count);
    return 0;
}

img


#include<stdio.h>
int main()
{
    int a[20] = { 3,5,11,13,17,18,20,26,33,35,46,49,51,56,58,63,65,71,73,76 };
    int i, count = 0, len = sizeof(a) / sizeof(a[0]), j, z, x, y, q, p;
    for (i = 0; i < len; i++)
    {
        for (j = i+1; j < len; j++)
        {
            for (z = j+1; z < len; z++)
            {
                for (x = z+1; x < len; x++)
                {
                    for (y = x+1; y < len; y++)
                    {
                        for (q = y+1; q < len; q++)
                        {
                            for (p = q+1; p < len; p++)
                            {
                                printf("%d %d %d %d %d %d %d\n", a[i],a[j],a[z],a[x],a[y],a[q],a[p]);
                            }
                        }
                    }
                }
            }
        }
    }
    return 0;
}

我就说下我的思路。不要选我的。
我是来讨论的。求批评的
如果是我做的话。我循环输出21个数字。然后平均分成三分数组。
写个函数,输入数组。当为奇数就输出到一个新的数组中。
在写个函数,输入数组,如果是偶数就输出到一个新数组。
然后三个数组可以分离出六个短数组。把这六个赋予一个随机值,怎么实现没头绪。然后在相加六个短数组。合成三个短数组
这样就得到六个不一样的数组。照这个方法去搞第七个数组。
然后我又想一个。但是我都不知道怎么实现。。还是不说了

代码参考如下:

int main(int argc, const char * argv[]) {
    int arr[20] = {3, 5, 11, 13, 17, 18, 20, 26, 33, 35, 46, 49, 51, 56, 58, 63, 65, 71, 73, 76};
    int n = 20; // 数组长度
    int len = 7; // 要输出的数组长度
    int nums = 0; // 计数
    for (int i1 = 0; i1 <= n - len; i1++) {
        
        for (int i2 = i1 + 1; i2 <= n - len + 1; i2++) {
            
            for (int i3 = i2 + 1; i3 <= n - len + 2; i3++) {
                
                for (int i4 = i3 + 1; i4 <= n - len + 3; i4++) {
                    
                    for (int i5 = i4 + 1; i5 <= n - len + 4; i5++) {
                        
                        for (int i6 = i5 + 1; i6 <= n - len + 5; i6++) {
                            
                            for (int i7 = i6 + 1; i7 <= n - len + 6; i7++) {
                                
                                nums++;
                                printf("组合%d:%d, %d, %d, %d, %d, %d, %d\n", nums, arr[i1], arr[i2], arr[i3], arr[i4], arr[i5], arr[i6], arr[i7]);
                            }
                        }
                    }
                }
            }
        }
    }
    return 0;
}

用递归

img

#include<stdio.h>

int re[7], len = 0;
int count = 0;
void pf(int a[],int d,int n,int m)
{
    if (len == m)
    {
        for (int i = 0; i < len; i++)
            printf("%d ", re[i]);
        printf("\n");
        count++;
        return;
    }
    for (int i = d; i <= n-(m-len); i++)
    {
        re[len++] = a[i];
        pf(a,i+1,n,m);
        len--;
    }
}
int main()
{
    int a[] = {3,5,11,13,17,18,20,26,33,35,46,49,51,56,58,63,65,71,73,76};
    int l = sizeof(a) / sizeof(a[0]);
    pf(a, 0,l,7);
    printf("共有%d组", count);
    return 0;
}
可以查看手册:c语言-数组 中的内容