注册 登录
编程论坛 C语言论坛

求求大佬解答,数组输入10个正整数,统计重复数字的个数,并输出重复数字和重复次数

哈哈哈哈镜 发布于 2023-11-08 15:21, 1611 次点击
数组输入10个正整数,统计重复数字数字,并输出重复数字和重复次数,否则输出no
8 回复
#2
沈和2023-11-08 16:04
A: 假设输入数据如下
1, 60, 55, 60, 24, 88, 75, 60, 48, 55
输出结果为 60: 3, 55: 2

B: 假设输入数据如下
74, 92, 70, 71, 33, 28, 32, 22, 9, 11
输出结果为: NO

分析:
这个问题是对数据的分组,拿第一组数据为例,可以分组为
1: 1,  60: 3,  55: 2,  24: 1,  88: 1,  75: 1,  60: 1,  48: 1
然后根据分组结果,判断有没有重复数字。

程序代码:

#include <stdio.h>

// 数在 nums 中时,返回下标,否则返回 -1
int data_in_nums(int num, int *array, int tail)
{
    for (int i = 0; i < tail; i++)
    {
        if (num == array[i])
        {
            return i;
        }
    }
    return -1;
}

int main()
{
    int data[] = {1, 60, 55, 60, 24, 88, 75, 60, 48, 55};
    // int data[] = {74, 92, 70, 71, 33, 28, 32, 22, 9, 11};

    int nums[10] = {0};
    int tail = 0;
    int counts[10] = {0};

    for (int i = 0; i < 10; i++)
    {
        int j = data_in_nums(data[i], nums, tail);
        if (j != -1)
        {
            counts[j] += 1; // 已经存在的数,计数加一
        }
        else
        {
            int k = tail;
            nums[k] = data[i]; // 不存在的数,存入 nums
            counts[k] = 1;     // 计数置 1
            ++tail;
        }
    }

    if (tail == 10)
    {
        puts("NO");
        return 0;
    }
    for (int i = 0; i < tail; i++)
    {
        if (counts[i] > 1)
        {
            printf("%d: %d\n", nums[i], counts[i]);
        }
    }
}


#3
哈哈哈哈镜2023-11-09 10:35
回复 2楼 沈和
谢谢๑•́₃•̀๑大佬
#4
哈哈哈哈镜2023-11-10 17:42
回复 2楼 沈和
想请教大佬,怎么才能写出这样巧妙的程序(可能是我太菜了,所以我觉得很巧妙)。因为我之前想了很多天,尝试了很多方法,但是都是有问题的。为啥能这样想出程序?
#5
沈和2023-11-10 18:17
后续你会学数据结构课,了解数据的不同组织形式,思路会打开的。
再之后使用 c++ 或者 java 这样的高级语言,它们提供很多现成的更强大的功能。

题外话,我比较好奇,你使用的是什么浏览器。论坛显示你使用的浏览器是“baidu 蜘蛛”。
#6
沈和2023-11-10 18:27
就当前这个“输出重复数字和重复次数”这种题目。它属于一类对数列的操作问题。

基础的分析思路有排序,分组计数,数列变换,数据汇总。多多思考一下,思路就出来了。
#7
哈哈哈哈镜2023-11-11 12:09
回复 5楼 沈和
就是百度,在软件商店下的百度,有啥其奇特的
谢谢大佬指导

[此贴子已经被作者于2023-11-11 12:12编辑过]

#8
沈和2023-11-11 14:57
回复 7楼 哈哈哈哈镜
我去下载试了下,也显示为 “baidu 蜘蛛”,好新奇。
#9
哈哈哈哈镜2023-11-13 13:52
回复 8楼 沈和
1