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;

}

posted @ 2020-09-03 06:41  财盛  阅读(472)  评论(0编辑  收藏  举报