【C语言】新的开始

行到云脚忽识路

**
大一漫无目的地过了一年,原本只想在原来的专业插科打诨,轻轻松松。什么“目标”啊,“规划”啊,统统丢到毕业后再考虑。但睡过了一个又一个的下午,嗨了一个又一个的夜晚,心里空落落的,“不得开心颜”。然后一个午后醒来,突然很想哭,不知道自己在干什么——这和当初说好的“惬意生活”不一样,没法过得心安理得。
其实早就知道了自己想干什么,但是很害怕去改变,去碰撞——新织好的窝那么comfortable。左思右想,不知道怎样的选择是对的,觉得那个让自己不好过的选择才是对自己好的(大概吧)。然后咬咬牙,闯进了计算机的世界。
现在,仍然不知道当初选择的对错,但日子确实不好过了(笑。
懵懵懂懂学了几个月,感受到了确实有写写博客的必要,记录自己的学习进程。

新的开始

在这里就先记录下自己写的一个题吧
众数问题

/*
//问题描述: 
给定含有n个元素的多重集合S,每个元素在S中出现的次数称为该元素的重数。多重集S中重数最大的元素称为众数。 
例如,S={1,2,2,2,3,5}。多重集S的众数是2,其重数为3。 
编程任务: 
对于给定的由n 个自然数组成的多重集S,编程计算S 的众数及其重数。

//输入
第1行多重集S中元素个数n(n<=50000);接下来的n 行中,每行有一个自然数。

//输出
输出文件有2 行,第1 行给出众数,第2 行是重数。(如果有多个众数,只输出最小的)

*/

#include<stdio.h>
#include<malloc.h>

int main(){
    int n;
    scanf("%d", &n);
    int *num, *hashTable;
    num = (int *)malloc(sizeof(int) * n);
    hashTable = (int *)malloc(sizeof(int) * n);

    //读入多重集的元素,并把对应的hashTable全部元素置0
    for(int i = 0; i < n; i++){
        scanf("%d", &num[i]);
        hashTable[i] = 0;
    }

    //冒泡排序,由小到大
    int temp;
    for(int i = 0; i < n; i++){
        for(int j = n - 1; j > i; j--){
            if(num[j] < num[j - 1]){
                temp = num[j - 1];
                num[j - 1] = num[j];
                num[j] = temp;
            }
        }
    }

    //记录每个元素的重复度
    for(int i = 0; i < n - 1; i++){
        for(int j = i; j < n; j++){
            if(num[i] == num[j]){
                hashTable[i]++;
            }
        }
    }

    //遍历寻找重复度最大的元素所在下标
    int pos = 0, maxn = hashTable[0];
    for(int i = 1; i < n; i++){
        if(hashTable[i] > maxn){
/*
 ** 注意这个大于号,即使有多个众数,最开始的那个仍不会被后来的替换,
 ** 而最开始的那个即使最小的那个众数,这便是进行冒泡排序的意义所在
 */
            maxn = hashTable[i];
            pos = i;
        }
    }

    printf("%d\n%d\n", num[pos], hashTable[pos]);

    return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_42313005/article/details/83052269