20200903--直方图(奥赛一本通P85 14)
给定一个非负整数数组,统计里面每一个数的出现次数,我们只统计到数组里最大的数。
假设Fmax(Fmzx<10000)是数组中最大的数,那么我们只统计{0,1,2,...Fmax)里每个数出现的次数。
输入:第1行n(1<=n<=10000)是数组的大小
紧接着一行是数组的n个元素。
输出:按顺序输出每个数的出现次数,利用桶排原理,一行一个数,如果没有出现过,则输出0
对于例子中的数组,最大的数是3,因此我只统计{0,1,2,3}的出现频率。
样例输入:
5
1 1 2 3 1
样例输出:
0 0
1 3
2 1
3 1
1、自己解法
#include <cstdio> //std io
#include <iostream>
#include <iomanip>
#include <cmath>
#include <cstring>
using namespace std;
int l[10000];//桶排后的元素表
int main()
{
int n;//元素数
int m[10000];//输入的元素
int max1=0;//求m中的最大值
printf("请输入元素数:");
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
cin>>m[i];
if(m[i]>max1)
{
max1=m[i];
}
}
int jzj=0;
memset(l,0,sizeof(l+1));
for(int j=1;j<=n;j++)
{
if(m[j]!=0)
{
l[m[j]+1]++;
}
}
for(int i=0;i<=max1;i++)
{
printf("%d ",i);
printf("%d\n",l[i+1]);
}
return 0;
}
2、书上解法
#include <cstdio> //std io
#include <iostream>
#include <iomanip>
#include <cmath>
#include <cstring>
using namespace std;
int l[10000];//桶排后的元素表
int main()
{
int n;//元素数
int m[10000],l[10000];//输入的元素
int max1=0;//求m中的最大值
printf("请输入元素数:");
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
cin>>m[i];
l[m[i]]++;
if(max1<m[i])
{max1=m[i];
}
}
for(int i=0;i<=max1;i++)
{
printf("%d ",i);
printf("%d\n",l[i]);
}
return 0;
}