眾數問題
阿新 • • 發佈:2020-12-10
題目要求:
在一個包含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;
}