问题
- 给定含有n个元素的多重集合S,每个元素在S中出现的次数称为该元素的重数。多重集S中重数最大的元素称为众数。例如,S={1,2,2,2,3,5}。多重集S的众数是2,其重数为3。对于给定的由n个自然数组成的多重集S,计算S的众数及其重数。
代码
- 排序法
#include <stdio.h>
#include <stdlib.h>
int main()
{
int a[100]={-1},n=0,i=0,max=0,s=0,t=0,j=0;
scanf("%d",&n);//输入数组 长度
for(;i<n;i++)
{
scanf("%d",&a[i]);//输入数组元素值
}
for(j=0;j<n-1;j++)//排序,每次找到最小值,循环进行
{
for(i=j+1;i<n;i++)
{
if(a[j]>a[i])
{
t=a[j];
a[j]=a[i];
a[i]=t;
}
}
}
s=1;
t=a[0];
for(i=1,j=0;i<n;i++)//遍历数组
{
if(a[i]==a[i-1])
s=s+1;//若数组元素a[i]==a[i-1],对应的个数s加1
else
s=1;//否则,s置1
if(max<s)//若s>max,将s赋给max,a[i]赋给t
{
max=s;
t=a[i];
}
}
printf("%d %d",t,max);//输出众数t,个数s
}
- 用空间换时间
#include <stdio.h>
#include <stdlib.h>
int main()
{
int a[100]={-1},b[100]={0},n=0,i=0,j=0,t=0,s=0;
scanf("%d",&n);//输入数组 长度
for(;i<n;i++)
{
scanf("%d",&a[i]);//输入数组元素值
}
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
if(a[i]==a[j])//循环判断数组元素个数并存储到b[i]
b[i]++;
}
}
for(i=0;i<n-1;i++)
{
for(j=i+1;j<n;j++)
{
if(b[j]>b[i])//循环比较找到最大的个数值t //以及众数所在数组下标s
{
t=b[j];
s=j;
}
}
}
printf("%d %d",a[s],t);//输出众数a[s],个数t
}