有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;
}
#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;
}
用递归
#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语言-数组 中的内容