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

2024-11-19 01:49:45
推荐回答(2个)
回答1:

运行结果是945组,代码如下:
#include
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 {
m=group[q-1];
}
for(;m {
flag=0;
for(p=0;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 {
group[n][m]=group[n-1][m];
}
}
}
else
{
y--;
if(y>=0)
{
last=group[n-1][y]+1;
q=y;
for(m=0;m {
group[n][m]=group[n-1][m];
}
}
}
}while(y>=0);

printf("组合有: \n");
for(i=0;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;
}

回答2:

1判断是否是单数,单数则返回-1,无法双等分。
2.使用冒泡排序法。直接将数组进行排序。
3.既然B[i]>A[i],申请内存空间类型为int ,长度为DATA的一半。一个为int A[],int B[].
4.循环遍历DATA,注意这里是排序之后的了。将偶数位置的赋值给A[i++],将奇数位置的赋值给B[j++]。i,j初始化为0.