题目描述
给定两个整数集合,它们的相似度定义为:N c/N t×100%。其中N c是两个集合都有的不相等整数的个数,Nt是两个集合一共有的不相等整数的个数。你的任务就是计算任意一对给定集合的相似度。
输入格式
输入第一行给出一个正整数N (≤ 50),是集合的个数。随后N 行,每行对应一个集合。每个集合首先给出一个正整数M (≤ 10 4),是集合中元素的个数;然后跟M 个**[0 ,1 09]**区间内的整数。
之后一行给出一个正整数K (≤ 2000),随后K 行,每行对应一对需要计算相似度的集合的编号(集合从1到N编号)。数字间以空格分隔。
输出格式
对每一对需要计算的集合,在一行中输出它们的相似度,为保留小数点后2位的百分比数字。
输入样例复制
在这里给出一组输入。例如:
3
3 99 87 101
4 87 101 5 87
7 99 101 18 5 135 18 99
2
1 2
1 3
输出样例
在这里给出相应的输出。例如:
50.00%
33.33%
参考代码:
cpp
#include<stdio.h>
typedef struct n
{
int a[104]={0};//集合
int M;//集合元素个数
}n;
int main()
{
n collection[50];
int N;
int temp;
scanf("%d",&N);//集合的个数
for(int i=0;i<N;i++)//读数据
{
scanf("%d",&collection[i].M);
for(int j=0;j<collection[i].M;j++)
{
scanf("%d",&collection[i].a[j]);
}
}
for(int i=0;i<N;i++)//集合内冒泡排序
{
temp=0;
for(int j=0;j<collection[i].M-1;j++)
{
for(int k=0;k<collection[i].M-j-1;k++)
{
if(collection[i].a[k]>collection[i].a[k+1])
{
temp=collection[i].a[k];
collection[i].a[k]=collection[i].a[k+1];
collection[i].a[k+1]=temp;
}
}
}
}
int cs;//集合比较次数
scanf("%d",&cs);
int o,p;//比较的两个集合
int combine[208]={0};//合并的两个集合
for(int i=0;i<cs;i++)
{
double RC=0.0,RT=0.0;
scanf("%d %d",&o,&p);
for(int j=0;j<collection[o-1].M;j++)//找RC--两个集合中相等的个数
{
if(collection[o-1].a[j]==collection[o-1].a[j+1])//前后相等时直接跳过相等到下一个
{
continue;
}
for(int k=0;k<collection[p-1].M;k++)
{
if(collection[p-1].a[k]==collection[p-1].a[k+1])//前后相等时直接跳过相等到下一个
{
continue;
}
if(collection[o-1].a[j]==collection[p-1].a[k])
{
RC++;
}
}
}
//printf("%.0lf ",RC);//测试
for(int j=0;j<collection[o-1].M;j++)//合并集合元素,计算RT
{
combine[j]=collection[o-1].a[j];
}
for(int k=0;k<collection[p-1].M;k++)
{
combine[k+collection[o-1].M]=collection[p-1].a[k];
}
for(int j=0;j<collection[o-1].M+collection[p-1].M-1;j++)
{
for(int k=0;k<collection[o-1].M+collection[p-1].M-j-1;k++)
{
if(combine[k]>combine[k+1])
{
temp=combine[k];
combine[k]=combine[k+1];
combine[k+1]=temp;
}
}
}
for(int j=0;j<collection[o-1].M+collection[p-1].M;j++)
{
if(combine[j]==combine[j+1])
{
continue;
}
else
{
RT++;
}
}
//printf("%.0lf\n",RT);//测试
printf("%.2lf",RC/RT*100);
printf("%\n");
}
return 0;
}
解释:
1.其实以上代码并非最简单版本,因为冒泡排序那里可以单独写入一个函数里,方便调用。
2.在问题描述时使用的是NC和NT,以上代码用了替换,NC-->RC,NT-->RT
3.以上代码还用到了比较少用到的结构体数组,主要是觉得方便处理一组一组的数据,方便给数组编号
NO.38
好了,各位小伙伴有什么问题可以评论区见,感谢!
<C语言数据结构>