• C/C++算法入门 | 简单模拟


    不爱生姜不吃醋⭐️
    如果本文有什么错误的话欢迎在评论区中指正
    与其明天开始,不如现在行动!


    🌴前言

    本文内容是关于C/C++算法入门的简单模拟题,没有涉及很复杂的算法,主要考察代码能力。模拟是一类“题目怎么说,你就怎么做”的题目,如果实现起来不太麻烦,就可以称之为“简单模拟”。这类题目不涉及算法,完全知识根据题目描述来进行代码的编写,所以考察的是代码能力。本文算法为:害死人不偿命的(3n+1)猜想和挖掘机技术哪家强。


    🌴一、害死人不偿命的(3n+1)猜想

    1.题目(PAT B1001)

    题目描述

    卡拉兹猜想:
    对任何一个自然数n,如果它是偶数,那么就把它砍掉一半;如果它是奇数,那么把(3n+1)砍掉一半。这样一直反复砍下去,最后一定在某一步得到n=1。卡拉兹在1950年的世界数学家大会上公布了这一猜想,传说当时耶鲁大学师生齐动员,拼命想证明这个貌似很荒唐······
    在此处并非想要证明卡拉兹猜想,而是对给定的任一不超过1000的正整数n,简单数一下,需要多少步才能得到n=1?

    输入格式

    每个测试输入包含1个测试用例,即给出自然数n的值。

    输出格式

    输出从n计算到1需要的步数

    输入样例

    3

    输出样例

    5

    2.思路

    1. 首先对输入进行判断,如果是1,直接return 0
    2. 如果不是1,再进while循环判断奇偶
    3. 偶数直接除2
    4. 奇数先运算再除2
    5. 运算完的数再进行判断
    6. 每执行一次循环,计数器就加一

    3.代码实现

    #include 
    
    int stepNum(int a){
        if(a == 1){
            return 0;
        }
    
        int num = 0;
        while (a != 1)
        {
            if(a % 2 == 0){
                a /= 2;
            }else{
                a = (a * 3 + 1) / 2;
            }
            num++;
        }
        return num;
    }
    
    int main(){
        int a;
        scanf("%d", &a);
        int num = stepNum(a);
        printf("%d", num);
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27

    🌴二、挖掘机技术哪家强

    1.题目(PAT B1032)

    题目描述

    为了用事实说明挖掘机技术到底哪家强,PAT组织了一场挖掘机技能大赛。请根据比赛结果统计出技术最强的那个学校。

    输入格式

    在第一行给出不超过10^5的正整数N,即参赛人数。随后N行,每行给出一位参赛者的信息和成绩,包括其所代表的学校的编号(从1开始连续编号)及其比赛成绩(百分制),中间以空格分隔。

    输出格式

    在一行中给出总得分最高的学校的编号及其总分,中间以空格分隔。题目保证答案唯一,没有并列。

    输入样例

    6
    3 65
    2 80
    1 100
    2 70
    3 40
    3 0

    输出样例

    2 150

    2.思路

    1. 先确定参赛人数,由参赛人数来确定可以有几个得分
    2. 定义数组,把每个相同学校的得分相加
    3. 最终确定最高分和最高分的学校

    3.代码实现

    #include 
    #include 
    
    const int N = pow(10,5);
    int main(){
        int schID, score;
        int num;
        scanf("%d", &num);
        if(num > N){
            printf("参赛人数超出限制!");
            exit;
        }
    
        int gameNum[num] = {0};
        for (int i = 0; i < num; i++)
        {
            scanf("%d%d",&schID, &score);
            gameNum[schID] += score; 
        }
    
        int MAX = 0;
        int ID;
        for (int i = 0; i < num; i++)
        {
            if (gameNum[i] > MAX){
                MAX = gameNum[i];
                ID = i;
            }
        }
        printf("%d %d", ID, MAX);
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32

    🌴总结

    文章中代码的编写使用的都是C/C++基础知识,多加练习熟能生巧。
    本文中若是有出现的错误请在评论区或者私信指出,我再进行改正优化,如果文章对你有所帮助,请给博主一个宝贵的三连,感谢大家😘!!!


  • 相关阅读:
    技术分享 | 接口测试中,请求超时该怎么办?
    Unity Hub报错:No valid Unity Editor license found. Please activate your license.
    八大排序详解(默认升序)
    趣味算法一棋盘的麦子
    将Pytorch搭建的ViT模型转为onnx模型
    大集合按照指定长度进行分割成多个小集合,用于批量多次处理数据
    1015:计算并联电阻的阻值
    Linux内核设计与实现 第十章 内核同步
    Flink SQL 子图复用逻辑分析
    Nacos下载与安装
  • 原文地址:https://blog.csdn.net/weixin_54620350/article/details/132990917