湖南大学程序实训一 1.众数问题(报告版)

一、问题描述

【问题描述】

一组数据中出现最多的数,称为众数。比如

1 2 3 3

众数为3。一组数据中也可能有多个众数,以最先出现的作为众数。比如

2 2 3 3

众数为2。

   问题是一组按升序排好的数据,指出它的众数。

【输入形式】

有多组测试数据(不超过100组测试数据)。

每组测试数据占两行,第一行是正整数N:表示这组测试数据中数据项数。

第二行是N个用空格隔开的正整数,表示这组测试数据的数据元素。每个数据元素都不大于10000。

N=0,表示输入结束,并且不需要处理。

40%的测试数据N 1 ≤N≤ 10;

30%的测试数据N 10 < N≤ 100;

20%的测试数据N 100 < N≤ 1000;

10%的测试数据N 1000 < N≤ 10000;

【输出形式】

对于每组测试数据,输出一行包含一个正整数:对应的众数。

二、问题分析及边界条件

要处理的问题:

1.N≠0 时输入多组数据

2.在每组有序数据中找出现最多的数字

边界条件:

1.N=0 时结束输入

2.数字出现次数相等,输出早出现的数字

三、算法设计

通过上述分析,将采用下面的方法解决相关问题:

1.使用 while 循环输入N并确定是否为0

2.使用动态数组保存输入的数字

3.使用整形分别存储当前出现最多的个数、当前数字的个数、当前个数最多的数字

4.使用一个 for 循环从前往后遍历数组(已经拍好序), 如果后项=前项,当前次数+1;反之,比较当前个数与最多个数,若当前个数更大,替换最多个数,同时替换最多为当前数字(注意:向后循环时当前个数要清零才可去记录下一个数)

5.输出最多的数字

四、详细设计(从算法到程序)

1.建立整形 N

2.循环输入 N 并判断是否结束

while(cin>>N&&N!=0) {}

 3.建立整形动态数组,存储 N 个数字

int *a=new int[N];

4. 整形 num 记录当前数字的个数,max记录当前最大的个数(比较大小时常用一个额外的min/max来存储当前最小/最大,之后如果有更小/更大就替换),x记录当前的众数

5.for 循环找众数

for(int i=0;i<=N;i++){
    if(a[i-1]==a[i]){
        num++;
    }
    else{
        if(max<num){
            max=num;
            x=a[i-1];
        }
        num=0;
    }     
cout<<x<<endl;

6.代码展示 

#include <iostream>
using namespace std;
int main()
{
    int N;
    while(cin>>N&&N!=0){
        int *a=new int[N];
        for(int i=0;i<N;i++){
            cin>>a[i];
        }
        int num=0,max=0,x=0;
        for(int i=0;i<=N;i++){
            if(a[i-1]==a[i]){
                num++;
            }
            else{
                if(max<num){
                    max=num;
                    x=a[i-1];
                }
                num=0;
            }
        }
        cout<<x<<endl;
    }
    return 0;
}

五、样例设计与测试

1.正常测试

 

2.存在多个众数

六、分析与总结

1.当采用一个整形记录各个数的个数时,开始下一个前清零

2.求有序数组众数时,可以从前往后遍历,设置一个变量来记录;无序数组可排序变为有序,或者采用数组记录各个数的个数(较麻烦,不能确定数字有多少种)

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值