题目要求:
在一个包含n个元素的多重集合S中,每个元素在S中出现的次数称为该元素的重数,多重集合S中重数最大的元素称为众数
举例来说,多重集合S={1,2,3,3,3,3,4,4,5},则多重集合S的众数是3,元素3的重数为4
现要求对随机生成的由n个自然数组成的多重集合S,编程计算S的众数及其重数
主要思路:
先生成含有N个元素的随机数组,定义两个数组,一个用来存放数组元素,一个用来存放各元素的个数,找出个数最大的下标对应的数组元素。
第一步是调用随机数生成数组,这里我为了方便,将随机数的生成范围取为10以内,后面可以更改。
第二步是计算每个元素的个数,为了后续在找出众数时,不会重复,我把每个元素的个数定位从自己往后的计数,这样,如果出现了多次3,最多的个数是最前面的,后面的会依次少1。
第三步是通过一次循环,找出个数值最大的,这里找出的是第一次的最大,就是说如果数字2出现4次,数字5出现4次,这里找出的是数字2对应的4。
第四步是找出所有个数值都是最大值的元素。例如上面的例子,这次就会找出个数值也为4的数字5.
#include<iostream>
#include<iomanip>
#include<time.h>
using namespace std; //随机数函数头文件
void print(int arr[], int n)
{
for(int j=0;j<n;j++)
{
cout<<arr[j]<<'\t';
}
cout<<endl;
}
int main()
{
int N;
cout<<"请输入随机生成的整数序列的数字个数:";
cin>>N;
int a[1000],b[1000];
srand(time(0)); //调用随机数
for(int k=0;k<N;k++)
{
a[k]=1+rand()%10; //随机数的使用方法
}
cout<<"随机生成的数组为:\n";
print(a,N);
for(int m=0;m<N;m++)//每个元素的个数清零
{
b[m]=0;
}
for(int n=0;n<N;n++)//记录每个元素从自己(包含自己)往右的个数
{
for(int j=n;j<N;j++)
{
if(a[n]==a[j])
b[n]++;
}
}
//print(b,N);
int same,max=-1;
for(int i=0;i<n;i++)
{
if(b[i]>max)
{
max=b[i];
same=a[i];
}
}
//cout<<same<<" "<<max<<'\n';
cout<<"集合的众数是:";
for(int s=0;s<n;s++)
{
if(b[s]==max)
cout<<a[s]<<" ";
}
cout<<"该众数的重数是"<<max<<'\n';
return 0;
}