# include<stdio.h>
# define N 12
float t;
int i,j,k,l,m,n;
int main(void)
{
void zbcl (float ab[3][N]);
void sort (float ab[3][N]);
void fz (float ab[3][N], int ab_idx[N][N], int abnum[], int * abn);
void print_ab(float ab[3][N]);
void print_ab_idx(int ab_idx[][N], int * abn, int abnum[]);
void print_max_zb(float ab[][N], int max[],int * maxnum);
float a[3][N] = {{0},{0},{0.50,1.41,3.00,3.37,3.40,4.72,4.72,5.43,7.57,8.38,8.98,9.50}};
float b[3][N] = {{0},{0},{2.00,3.50,1.50,3.49,5.50,2.00,6.24,4.10,2.01,4.50,3.41,0.80}};
int an=0,bn=0,maxnum=0;
int a_idx[N][N]={0},b_idx[N][N]={0};
int anum[N]={0},bnum[N]={0},max[N]={0},tmp[N]={0};
//步骤1:初始化坐标数组,并处理坐标值
zbcl(a);
zbcl(b);
//步骤2:排序
sort (a);
sort (b);
//步骤3:分子组
fz (a, a_idx, anum, &an);
fz (b, b_idx, bnum, &bn);
//步骤4:求交集
for(i=0; i<an; i++)
for(k=0; k<bn; k++)
{
n=0;
for(j=0; j<=anum[i]; j++)
{
for(l=0; l<=bnum[k]; l++)
{
if(a_idx[i][j] == b_idx[k][l])
{
tmp[n]=a_idx[i][j];
n++;
break;
}
}
}
if(n>=maxnum)
{
maxnum=n;
for(m=0; m<maxnum; m++)
max[m]=tmp[m];
}
}
//步骤5:输出
//输出二维数组a,b
printf("\nA:\n");
print_ab(a);
printf("\nB:\n");
print_ab(b);
//输出子组
printf("\nAi:\n");
print_ab_idx(a_idx, &an, anum);
printf("\nBj:\n");
print_ab_idx(b_idx, &bn, bnum);
//输出最大交集及其对应坐标
printf("\nAi∩Bj:\n");
for(i=0; i<maxnum; i++)
printf("%d\t", max[i]);
printf("\n");
print_max_zb(a, max, &maxnum);
printf("\n");
print_max_zb(b, max, &maxnum);
return 0;
}
void zbcl (float ab[3][N])
{
for(i=0; i<N; i++)
{
ab[0][i] = i+1;
t = ab[2][i]-(int)ab[2][i];
if(t > 0.5)
t -= 1;
ab[1][i] = t;
}
}
void sort (float ab[3][N])
{
for(i=0; i<N; i++)
{
for(j=0; j<N-1-i; j++)
{
if(ab[1][j] > ab[1][j+1])
for(l=0; l<3; l++)
t=ab[l][j], ab[l][j]=ab[l][j+1], ab[l][j+1]=t;
}
}
}
void fz (float ab[3][N], int ab_idx[N][N], int abnum[], int * abn)
{
for(i=0,k=0; i<N; i++,k++)
{
t = ab[1][i]+0.1;
for(j=i,l=0; j<N&&ab[1][j]<=t; j++,l++)
{
ab_idx[k][l] = ab[0][j];
abnum[k] = l;
}
ab_idx[k][l] = 0;
*abn = k;
if(k!=0 && ab_idx[k][abnum[k]]==ab_idx[k-1][abnum[k-1]])
{
for(n=0