寻找众数及其个数<C语言>

给出一系列数,然后找出其中的众数及其个数:

#include <stdio.h>
int main()
{
    int a[50];
    int i,j,maxCount=0,index=0,nCount=0;
    int n;



    scanf("%d",&n);            //输入数据元素
    for(i=0;i<n;i++)
    {
        scanf("%d",&a[i]);
    }

    for(i=0;i<n;i++)           //双循环记数
    {
        for(j=0;j<n;j++)
        {
            if(a[j]==a[i])
                nCount++;
        }

        if(nCount>maxCount)
        {
            maxCount=nCount;
            index=i;
        }

        nCount=0;
    }
    printf("%d\n%d",a[index],maxCount);         //输出




}
  • 9
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
求一个数组中的数和重数可以使用分治算法来实现。分治算法是将问题分解成多个子问题,然后递归求解这些子问题,最后将子问题的结果合并起来得到原问题的解。 下面是使用分治算法求一个数组中的数和重数的C语言实现代码: ```c #include <stdio.h> // 求数和重数 void majority(int a[], int l, int r, int *num, int *cnt) { if (l == r) { // 数组中只有一个元素 *num = a[l]; *cnt = 1; return; } int mid = (l + r) / 2; int left_num, left_cnt; majority(a, l, mid, &left_num, &left_cnt); // 递归求解左半部分 int right_num, right_cnt; majority(a, mid + 1, r, &right_num, &right_cnt); // 递归求解右半部分 if (left_num == right_num) { // 左右两部分的数相同 *num = left_num; *cnt = left_cnt + right_cnt; } else { // 左右两部分的数不同 int left_cnt2 = 0; for (int i = l; i <= mid; i++) { if (a[i] == left_num) { left_cnt2++; } } int right_cnt2 = 0; for (int i = mid + 1; i <= r; i++) { if (a[i] == right_num) { right_cnt2++; } } if (left_cnt2 > right_cnt2) { *num = left_num; *cnt = left_cnt2; } else { *num = right_num; *cnt = right_cnt2; } } } int main() { int a[] = { 1, 2, 3, 3, 3, 4, 4, 5, 5 }; int num, cnt; majority(a, 0, 8, &num, &cnt); printf("数是%d,重数是%d\n", num, cnt); return 0; } ``` 在这个实现中,majority函数是递归求解数和重数的函数。它将数组分成左右两部分,分别递归求解左右两部分的数和重数,然后合并这些结果。如果左右两部分的数相同,那么就直接返回这个数和它在整个数组中的重数。如果左右两部分的数不同,那么就在左右两部分中分别计算这些数在对应部分中的出现次数,然后返回出现次数更多的那个数和它在整个数组中的重数。 上述代码的时间复杂度为O(nlogn),其中n是数组中的元素个数。这个算法的空间复杂度是O(logn),因为它是一个递归算法,递归深度是O(logn)。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值