C语言编程,这题怎么做? 20

有一组Int类型数组,intDATA[10]={0,1,2,3,4,5,6,7,8,9},要求将data数组中的元素等分成2组(每组元素个数相等),分别为A组和B组,且满... 有一组Int类型数组,int DATA[10] ={0,1,2,3,4,5,6,7,8,9},要求将data数组中的元素等分成2组(每组元素个数相等),分别为A组和B组,且满足B[i] > A[i],请设计一个函数,计算出A组和B组的组合个数,组合举例A组:[0,2,4,6,8]; B组:[1,3,5,7,9]; 展开
 我来答
wenqing8585
2017-09-30 · TA获得超过8258个赞
知道大有可为答主
回答量:8078
采纳率:70%
帮助的人:4038万
展开全部
运行结果是945组,代码如下:
#include <stdio.h>
int FindNext(int A_index[], int B_index[], int group[],int x, int q, int start)
{
int m=start, flag, p;
if((q>0)&&(start<group[q-1]))
{
m=group[q-1];
}
for(;m<x;m++)
{
flag=0;
for(p=0;p<q;p++)
{
if((A_index[group[p]]==A_index[m])
||(A_index[group[p]]==B_index[m])
||(B_index[group[p]]==A_index[m])
||(B_index[group[p]]==B_index[m]))
{
flag=1;
break;
}
}
if(flag==0)
{
return m;
}
}
return -1;
}
int AnalyseArray(int data[])
{
int A_index[1000], B_index[1000];
int i, j, k, m, n=0, x=0, y=4, q=0, last=0;
int group[1000][5];

for(i=0;i<10;i++)
{
for(j=0;j<10;j++)
{
if((j!=i)&&(data[j]>data[i]))
{
A_index[x]=i;
B_index[x]=j;
x++;
}
}
}

do
{
m=FindNext(A_index, B_index, group[n], x, q, last);
if(m>=0)
{
group[n][q]=m;
q++;

if(q>=5)
{
y=4;
n++;
last=group[n-1][y]+1;
q=y;
for(m=0;m<y;m++)
{
group[n][m]=group[n-1][m];
}
}
}
else
{
y--;
if(y>=0)
{
last=group[n-1][y]+1;
q=y;
for(m=0;m<y;m++)
{
group[n][m]=group[n-1][m];
}
}
}
}while(y>=0);

printf("组合有: \n");
for(i=0;i<n;i++)
{
printf("%d) A组[",i+1);
for(k=0;k<5;k++)
{
m=group[i][k];
j=A_index[m];
printf("%d ",data[j]);
}
printf("]; B组[");
for(k=0;k<5;k++)
{
m=group[i][k];
j=B_index[m];
printf("%d ",data[j]);
}
printf("]\n");
}

return n;
}

int main()
{
int DATA[10]={0,1,2,3,4,5,6,7,8,9};
int ret = AnalyseArray(DATA);
printf("共%d组\n",ret);
return 0;
}
更多追问追答
追答
上面的结果有部分组合是重复的,我又修正了一下
int AnalyseArray(int data[])
{
int A_index[1000], B_index[1000];
int i, j, k, m, n=0, x=0, y=4, p=0, q=0, last=0;
int group[1000][5];

for(i=0;idata[i]))
{
A_index[x]=i;
B_index[x]=j;
x++;
}
}
}

do
{
m=FindNext(A_index, B_index, group[n], x, q, last);
if(m>=0)
{
group[n][q]=m;
q++;

if(q>=5)
{
m=0;
for(p=0;p=5)
{
break;
}
}
y=4;
q=y;
last=group[n][y]+1;
if(m=0)
{
last=group[n][y]+1;
q=y;
}
}
}while(y>
百度网友05af92258
2017-09-30 · TA获得超过578个赞
知道小有建树答主
回答量:290
采纳率:62%
帮助的人:121万
展开全部
1判断是否是单数,单数则返回-1,无法双等分。
2.使用冒泡排序法。直接将数组进行排序。
3.既然B[i]>A[i],申请内存空间类型为int ,长度为DATA的一半。一个为int A[],int B[].
4.循环遍历DATA,注意这里是排序之后的了。将偶数位置的赋值给A[i++],将奇数位置的赋值给B[j++]。i,j初始化为0.
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式