c语言编程,对任意一组数字,如{3,1,4,7,2,1,1,2,2},输出其中出现次数最多的数字,并显示出现的次数。

网上也有编程,没看懂,关键思路是什么?能否给解释一下。... 网上也有编程,没看懂,关键思路是什么?能否给解释一下。 展开
 我来答
百度网友3b5a5d8
2019-03-19 · TA获得超过1229个赞
知道大有可为答主
回答量:1279
采纳率:83%
帮助的人:133万
展开全部

如果是任意大小的数字,那么有些麻烦,可以设定两个默认值代表最多的数字和最多的次数。接着去轮询,并计数,如果次数大于默认值,替换即可。遍历完成即可输出那两个值。

如果是0~9,或者字母的话,比较简单。可以定义定长的数组,数组下标代表具体值,数组的内容代表值出现的次数,遍历一遍原数组,得到次数。遍历定长数组,得到值。

第一种方法代码如下,第二种自己琢磨吧。

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char const *argv[])
{
    int num = 0;    //用来存最多值的数值,默认为0
    int coumt = 0;  //用来存最多值的个数,默认为0
    int temp = 0;   //中间变量
    int n = 0;      //数组的个数
    int *p = NULL;  //开辟空间的首地址,等价于&a[0]

    printf("Pls enter the number of arrays:");
    while(1)
    {
        scanf("%d", &n);
        if(n <= 0)
            printf("Error is scanf,pls try again\n");
        else
            break; 
    }

    p = (int *)malloc(sizeof(int) * n);
    if(p == NULL)
    {
        printf("Error is malloc\n");
        return -1;
    }

    for (int i = 0; i < n; ++i)
    {
        printf("Pls enter the num for buf[%d]=", i+1);
        scanf("%d", &p[i]);
    }

    for (int i = 0; i < n; ++i) //简单的遍历查找
    {
        temp = 0;
        for (int j = i; j < n; ++j)
        {
            if (p[i] == p[j])
            {
                temp++;//计数
            }
        }
        if(coumt < temp)//如果次数大于默认值,替换
        {
            coumt = temp;
            num = p[i];
        }
    }
    
    printf("The most common number is %d and the coumt is %d\n", num, coumt);

    return 0;
}

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char const *argv[])
{
    int coumt = 0;  //用来存最多值的个数,默认为0
    int temp = 0;   //中间变量,用于计数
    int n = 0;      //数组的个数
    int *p = NULL;  //开辟空间的首地址,等价于&a[0]
    int *num = NULL; //开辟空间的首地址,等价于&a[0]
    int flag = 0;   //定义一个标志位,用于计数重复的次数的数值出现

    printf("Pls enter the number of arrays:");
    while(1)
    {
        scanf("%d", &n);
        if (n <= 0)
            printf("Error is scanf,pls try again\n");
        else
            break; 
    }

    p = (int *)malloc(sizeof(int) * n);//存放你要的数组
    if (p == NULL)
    {
        printf("Error is malloc for p\n");
        return -1;
    }

    num = (int *)malloc(sizeof(int) * n);//存放最多数值的数组,最坏情况,没有重复数字
    if (num == NULL)
    {
        printf("Error is malloc for num\n");
        return -1;
    }

    for (int i = 0; i < n; ++i)
    {
        printf("Pls enter the num for buf[%d]=", i+1);
        scanf("%d", &p[i]);
    }

    for (int i = 0; i < n; ++i) //简单的遍历查找,找出最大的次数
    {
        temp = 0;
        for (int j = i; j < n; ++j)
        {
            if (p[i] == p[j])
            {
                temp++;//计数
            }
        }
        if (coumt < temp)//如果次数大于默认值,替换
            coumt = temp;
    }

    for (int i = 0; i < n; ++i) //简单的遍历查找,找出重复的次数
    {
        temp = 0;
        for (int j = i; j < n; ++j)
        {
            if (p[i] == p[j])
            {
                temp++;//计数
            }
        }
        if (coumt == temp)//如果次数等于最大值,存储
        {
            num[flag] = p[i];
            flag++;
        }
    }
    
    for (int i = 0; i < flag; ++i)
        printf("The most common number is %d and the coumt is %d\n", num[i], coumt);   

    free(p);
    free(num);
    return 0;
}
更多追问追答
追问
还是没明白,请编写c源程序,多谢!
追答
代码已经提交,因为例子中1 和 2 次数一样多,默认为先出现次数多的数字为结果。
如果满意请采纳。
来自黄鹤楼星光灿烂的木瓜
2019-03-16 · TA获得超过422个赞
知道小有建树答主
回答量:366
采纳率:65%
帮助的人:19.8万
展开全部
先给{3,1,4,7,2,1,1,2,2}a1 排序 得到{1,1,1,2,2,2,3,4,7}a2,再设个统计变量数组 a3[count ][value];循环数组a2比较2个数字是否相等。得到{(1,3),(2,3),(3,1),(4,1),(7,1)}a3。在遍历a3比较value大小,你会得到(1,3)和(2,3)。取1,2在到a1里面查找看哪个先出现。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式