【每日编程-408期】复旦大学上机题(一)

教育   2025-01-06 10:01   广西  

复旦大学上机题(一)


每日编程中遇到任何疑问、意见、建议请公众号留言或加入每日编程群聊739635399



求众数。众数就是一个序列中出现次数最多的数字。如果不唯一,则输出小的那个值。给定第一个代表有几个数字。1<=n<=10^5,每个数字在 int 范围内。

输入样例:

8
10 3 8 8 3 2 2 2

输出样例:

2

解决方法:

(1)代码实现:

#include 

int main()
{
    /*首先将数字输入到一个数组里面*/
    int m;
    printf("请输入数字的个数:");
    scanf("%d", &m);
    printf("请输入数字:");
    int n[100];
    int i = 0;
    while (i < m)
    {
        scanf("%d", &n[i]);
        ++i;
    }
    /*计算出每个数字是第几次出现,用另外的数组将这些次数存储*/
    int j = 0;
    int cs = 0;
    int k[100] = {0};
    for (i = 0; i < m; ++i)
    {
        cs = 1;
        for (j = 0; j < i; ++j)
        {
            if (n[j] == n[i])
            {
                cs++;
            }
        }
        k[i] = cs;
    }
    /*找出数组k中的最大值,也就是出现最多的次数,以及下标位置*/
    int max = 0, t = 0;
    for (i = 0; i < m; ++i)
    {
        if (max <= k[i])
        {
            max = k[i];
            t = i;
        }
    }
    /*上一步找到了出现最多的次数,但是可能会出现有两个或多个数字都出
   现这么多次的情况,所以要遍历数组k,找出所有的max*/

    int p[m];
    for (i = 0; i < m; ++i)
    {
        p[i] = -1;
    }
    j = 0;
    for (i = 0; i < m; ++i)
    {
        if (k[i] == max)
        {
            p[j] = i;
            ++j;
        }
    }
    /*上面几行是找到出现最多次数的数字的下标,并存储在数组p中,下面几行是找到这些数字中最小的一个*/
    int w[m];
    j = 0;
    while (p[j] != -1)
    {
        w[j] = n[p[j]];
        ++j;
    }
    int min = 1000;
    for (i = 0; i < j; ++i)
    {
        if (min > w[i])
        {
            min = w[i];
        }
    }
    printf("%d", min);
    return 0;
}

明日预告:复旦大学上机题(二)

解方程。给定一个字符串,代表一个一元一次方程。如果有解求解,输出格式“x=数字” ,如果解的个数无穷,输出 “infinite solutions”。如果没有解输出“no solution”

字符串长度不超过 256 。

输入格式:

输入一个一元一次方程,未知数用x表示。

输出格式:

输出 “x=数字” 或者 “infinite solutions”或者“no solution”

输入样例:

10x-2x-8=4x+7+x

输出样例:

x=5


灰灰考研
最全的【计算机考研】【软件考研】考研信息! 最丰富的共享资料! 最大程度上帮助学渣狗登上研究生大门!
 最新文章