【C刷题训练营】第四讲(打好基础很重要)(下)

简介: 【C刷题训练营】第四讲(打好基础很重要)(下)

BC33-计算平均成绩


来源:计算平均成绩_牛客题霸_牛客网 (nowcoder.com)

题目描述

从键盘输入5个学生的成绩(整数),求他们的平均成绩(浮点数,保留一位小数)

输入描述:

一行,连续输入5个整数(范围0~100),用空格分隔。

输出描述:

一行,输出5个数的平均数(保留一位小数)。

示例1

输入 75 80 43 67 96

输出 72.2


解题思路:

写法一:

int main() {
    int num[5] = {0};
    int i = 0;
    //输入
    for (i = 0; i < 5; i++) 
    {
        scanf("%d", &num[i]);
    }
    //求和
    int sum = 0;
    for (i = 0; i < 5; i++) {
        sum = sum + num[i];
    }
    //输出
    printf("%.1lf", sum / 5.0);
    return 0;
}


写法二:

int main() {
    int i = 0;
    int num = 0;
    int sum=0;
    //输入
    for (i = 0; i < 5; i++) 
    {
        scanf("%d", &num);
        //求和
        sum+=num;
    }
    //输出
    printf("%.1lf", sum / 5.0);
    return 0;
}


写法一和写法二执行:

2b5196a6b86a4c73a562eb170a278b73.png


BC34-进制A+B


来源:进制A+B_牛客题霸_牛客网 (nowcoder.com)

题目描述

输入一个十六进制数a和一个八进制数 b ,输出 a+b 的十进制结果(范围 -231~231-1 )。

输入描述:

一行,一个十六进制数a,和一个八进制数b,中间间隔一个空格。

示例1

输入 0x12 05

输出 23

备注:

十六进制Hexadecimal一般以0x开头,例 0xFF 。八进制 Octal ,一般以 0 开头,例如 07 


解题思路:

%x 是 16 进制的数据形式
%o 是 8 进制的数据形式

注意怎么输入十六进制和八进制即可解决此题

#include <stdio.h>
int main() {
   int a=0,b =0;
    //%x 是 16 进制的数据形式
    //%o 是 8 进制的数据形式
    scanf("%x %o",&a,&b);
    printf("%d",a+b);
    return 0;
}

执行 :

395638583ea546259261f7660ee6f915.png


BC37-网购


题目描述

KiKi非常喜欢网购,在一家店铺他看中了一件衣服,他了解到, 如果今天是“双11”(11月11日)则这件衣服打7折,“双12” (12月12日)则这件衣服打8折,如果有优惠券可以额外减50元(优惠券只能在双11或双12使用) ,求 KiKi 最终所花的钱数。

输入描述:

一行,四个数字,第一个数表示小明看中的衣服价格,第二和第三个整数分别表示当天的月份、当天的日期、第四个整数表示是否有优惠券(有优惠券用1表示,无优惠券用0表示)。

输出描述

一行,小明实际花的钱数(保留两位小数)。(提示:不要指望商家倒找你钱)

示例1

输入  1000.0 11 11 1

输出  650.00

示例2

输入 999.8 12 12 0

输出 799.84

示例3

输入  66.6 11 11 1

输出  0.00


解题思路:

方法一:

如果是11月11日

  1. 有优惠券:总价打7折,接着减50(假设买的东西不足50,那么商家不会倒贴找钱)。
  2. 无优惠券:总价打7折

如果是12月12日

  1. 有优惠券,总价打8折,接着减50(假设买的东西不足50,那么商家不会倒贴找钱)。
  2. 无优惠券:总价打8折。


代码实现:

#include <stdio.h>
int main() {
   double price=0.0;
   int mon=0,days=0;
   int flag=0;
    scanf("%lf %d %d %d",&price,&mon,&days,&flag);
      //条件是11月11日,有优惠券
        if(mon==11&&days==11 && flag==1)
        {   
            //价格打7折,减50
            price=price*0.7 - 50;
               //50块的券可以直接当作钱来付款,如果买的东西的价格不足50,商家不会找钱
            if(price<0)
            {
            price=0;
            }         
        }
        //条件是11月11日,无优惠券
        else  if(mon==11&&days==11 && flag==0)
        {  //价格打7折
          price=price*0.7;
        }
            //条件是12月12日,有优惠券
        else if(mon==12&&days==12 && flag==1)
            {   
                 //价格打8折,减50
               price= price*0.8-50;
                 //50块的券可以直接当作钱来付款,如果买的东西的价格不足50,商家不会找钱
               if(price<0)
               {
                price=0;
               }          
            }
        //条件是12月12日,无优惠券
        else if(mon==12&&days==12 && flag==0)
            {
                price = price*0.8;
            }
    //保留小数点后两位
    printf("%.2lf",price);
    return 0;
}


方法二:简化的写法

定义变量

price是价格,mon为月,days是日,

flag是1表示有优惠券,为0表示无优惠券

cut是折扣,last则表示实际花钱数

1️⃣如果是双11,cut*0.7

2️⃣如果是双12,cut*0.8

实际花出去的钱数 = 总价 * 折扣 - 优惠券(50 或 0)

也就是last= price * cut - flag * 50

如果花出去的钱小于0,那么商家不会倒贴,直接0元购

否则大于0,那就直接返回last

代码实现:

int main()
{
   double price=0.0;//价格
   int mon=0,days=0;//月,日
   int flag=0;//是否有优惠券
   double cut=1.0;//折扣
   double last=0.0;//实际花钱数
    //输入
    scanf("%lf %d %d %d",&price,&mon,&days,&flag);
    //双11打七折
    if(mon==11&&days==11)
    {
        cut=0.7;
    }
    //双12打8折
    else if(mon==12 && days==12)
    {
        cut=0.8;
    }
    //实际花出去的钱数 = 总价 * 折扣 - 优惠券(50 或 0)
    last= price * cut - flag * 50;
    //如果花出去的钱小于0,那么商家不会倒贴,直接0元购
     if(last<0.0)
     {
        printf("%.2lf\n",0.0);
     }
     //否则大于0,那就直接返回last
     else
      {
      printf("%.2lf\n",last);
     }
    return 0;
}


执行:

20f868adddbf41188b5d847303654954.png


BC39-争夺前五名


题目描述

期中考试开始了,大家都想取得好成绩,争夺前五名。从键盘输入n个学生成绩(不超过40个),输出每组排在前五高的成绩。

输入描述:

两行,第一行输入一个整数,表示n个学生(>=5),第二行输入n个学生成绩(整数表示,范围0~100),用空格分隔。

输出描述:

一行,输出成绩最高的前五个,用空格分隔。

示例1

输入

6

99 45 78 67 72 88

输出

99 88 78 72 67


解题思路:

1️⃣成绩录入部分:

定义变量n为学生的成绩数量,定义一个大小为40的整型数组用于存储每个学生的成绩,定义for循环接着输入每个学生的成绩。

2️⃣排序部分:

①冒泡排序

用冒泡排序的思想,将学生的成绩排成升序冒泡排序请看此篇文章:【C进阶】回调函数(指针进阶2,详解,小白必看)_Dream_Chaser~的博客-CSDN博客

代码实现:

#include<stdio.h>
//冒泡排序
int main() {
    int n = 0;//学生成绩的数量
    int arr[40] = { 0 };//存储成绩的数组
    int i = 0;
    scanf("%d", &n);
    for (i = 0; i < n; i++)
    {
        scanf("%d", &arr[i]);//输入每个学生的成绩
    }
    //冒泡排序
    for (i = 0; i < n - 1; i++)
    {
        int j = 0;
        int tmp = 0;
        for (j = 0; j < n - 1 - i; j++)
        {
            if (arr[j] > arr[j + 1])
            {
                tmp = arr[j];
                arr[j] = arr[j + 1];
                arr[j + 1] = tmp;
            }
        }
    }
    for (i = n - 1; i >= n - 5; i--)//注意这个地方i的范围,初值,以及判断条件
    {
        printf("%d ", arr[i]);
    }
    return 0;
}


②快速排序

利用qsort函数,实现学生成绩的升序排序

167575113c564d319a47e985e6de41a5.png

关于第④点函数指针

16402aa4fe7b4e42b45bc97943772aea.png

代码实现:

//快速排序
int cmp_int(const void* e1, const void* e2)
{
    return *(int*)e1 - *(int*)e2;
}
int main() {
    //输入
    int n = 0;//个数
    int arr[40] = { 0 };//存放的是成绩
    int i = 0;
    scanf("%d", &n);
    for (i = 0; i < n; i++)
    {
        scanf("%d", &arr[i]);
    }
    //排序 - 升序 - 后5个元素 - 就是最高的前5个成绩
    //qsort - C语言库函数
    qsort(arr, n, 4, cmp_int);
    for (i = n - 1; i >= n - 5; i--)//注意这个地方i的范围,初值,以及判断条件
    {
        printf("%d ", arr[i]);
    }
    return 0;
}


3️⃣输出部分:按降序的方式输出成绩排名最高的前5位学生

for (i = n - 1; i >= n - 5; i--)//注意这个地方i的范围,初值,以及判断条件
    {
        printf("%d ", arr[i]);
    }


以上两个排序的执行结果:

4c1800d8f68a4e928cdf57796ce841c0.png


BC40-竞选社长


题目描述

假设你们社团要竞选社长,有两名候选人分别是A和B,社团每名同学必须并且只能投一票,最终得票多的人为社长。

输入描述:

一行,字符序列,包含AB,输入以字符0结束。

输出描述:

一行,一个字符,ABE,输出A表示A得票数多,输出B表示B得票数多,输出E表示二人得票数相等。

示例1

输入 ABBABBAAB0

输出 B


解题思路:

写法一:

      定义一个字符数组,利用gets函数输入一行字符。定义count_a和count_b用于计算字符'A'和字符'B'的数量,定义i作为循环的前进条件。定义while循环,循环的判定条件是字符数组buf[i]!=‘\0’,若遍历过程中遇到‘A‘则count_a++,遇到‘B’,则count_b++,i++继续遍历while循环

 最后输出部分,如果count_a>count_b,则输出,'A'。反之输出‘B’,如果两字符数量相等,则输出'E'。

int main() {
    char buf[100]={0};
    //输入
    gets(buf);
    //统计
    int count_a = 0;
    int count_b = 0;
    int i=0;
    while(buf[i]!='0')
    {
        if(buf[i] =='A')
        {
            count_a++;
        }
        if(buf[i]=='B')
        {
            count_b++;
        }
        i++;
    }
    //输出
    if(count_a > count_b)
    {
        printf("A\n");
    }
    else if(count_a < count_b)
    {
        printf("B\n");
    }
    else
    {
        printf("E\n");
    }
    return 0;
}


写法二:

与写法一大致思路相似,只是定义了一个flag作为判断条件,若遇到’A‘,则flag++ ,反之遇到‘B’则--。到最后若flag>0,则输出‘A’,反之则‘B’,若flag为0则输出‘E’。

int main()
{
    char buf[100] = {0};
    //输入
    gets(buf);
    //统计
    int flag=0;
    int i=0;
    while(buf[i]!='0')
    {
        if(buf[i] == 'A')
        {
            flag++;
        }
        if(buf[i] == 'B')
        {
            flag--;
        }
        i++;
    }
    //输出
    if(flag>0)
    {
        printf("A\n");
    }
    else if(flag<0)
    {
        printf("B\n");
    }
    else
    {
    printf("E\n");
    }
    return 0;
}

写法三:

从用户输入中逐个读取字符,并根据不同的字符进行不同的操作,直到遇到字符 '0' 或文件结束符(EOF)为止。

  • 如果读取的字符是 'A',则执行 flag++,即将变量 flag 的值加一。
  • 如果读取的字符是 'B',则执行 flag--,即将变量 flag 的值减一。

其它思路基本不变。

int main()
{
    //输入  
    int ch = 0;
    int flag = 0;
    while (((ch = getchar()) != '0') && ch != EOF)
    {
        if (ch == 'A')
        {
            flag++;
        }
        if (ch == 'B')
        {
            flag--;
        }
    }
    if (flag > 0)
    {
        printf("A\n");
    }
    else if (flag < 0)
    {
        printf("B\n");
    }
    else
    {
        printf("E\n");
    }
    return 0;
}

写法一二三执行:

0297e02fc6e44ce0aae98f6a5c3ff80a.png

  c语言刷题训练营第4讲到此结束,感谢大家支持!

相关文章
|
7月前
|
人工智能 运维 搜索推荐
《腾讯Codeboddy+AI让古诗文教学开挂!语文老师3步搞定智能备课系统》
本文探讨了语文教师在教育数字化转型中面临的“数字鸿沟”问题,如时间消耗、技术门槛等,并介绍了腾讯CodeBuddy作为破局神器的三大教学革命。通过智能生成代码,教师可快速创建互动课件,大幅减少开发耗时,提升学生参与度。此外,系统还能进行学情分析和教研资源沉淀,助力个性化教学与校本资源优化。最终实现从工具升级到教学革命的飞跃,推动教育数字化进程。
179 0
《腾讯Codeboddy+AI让古诗文教学开挂!语文老师3步搞定智能备课系统》
|
8月前
|
安全 前端开发 Android开发
拥抱国产化:转转APP的鸿蒙NEXT端开发尝鲜之旅
本文将要分享的是转转APP在开发全新鸿蒙NEXT端所遇到的一些问题,对比了鸿蒙开发和 Android、iOS 的不同,总结了这次开发过程中的一些经验等等。希望能带给你启发。
542 0
|
11月前
|
vr&ar 图形学 计算机视觉
突破次元壁!新加坡国立发布GenXD:拿捏真实感3D、4D动态场景
新加坡国立大学团队发布GenXD,突破3D和4D场景生成难题。通过利用常见相机和物体运动,提出数据整理管道及大型4D数据集CamVid-30K,开发出能生成逼真3D/4D场景的框架。其多视角-时间模块分离相机与物体运动,支持条件视图生成。尽管存在数据覆盖和复杂场景处理的挑战,GenXD仍显著提升了生成效果,为虚拟现实、游戏开发等领域带来新机遇。论文链接:https://arxiv.org/abs/2411.02319。
228 11
|
数据采集 安全 数据处理
制造业、工程设计行业、创投行业的数据治理痛点与解决方案
关注监管政策动态:密切关注数据治理相关法律法规的发布和更新,及时调整企业数据治理策略,确保合规经营。
制造业、工程设计行业、创投行业的数据治理痛点与解决方案
|
安全 算法 网络安全
过等保测评应该选择哪种SSL证书
在等保测评中,选择合适的SSL证书至关重要。推荐使用支持RSA、DSA、ECC或SM2、SM3、SM4等加密算法的证书,密钥长度至少2048位。应选择国内可信赖的CA机构颁发的证书,确保数据不出境。申请流程包括访问官网(如JoySSL)、注册账号、选择证书类型、提交申请、等待验证及下载安装。综合考虑证书类型、加密算法、CA机构等因素,确保网站安全合规。
|
传感器 机器学习/深度学习 自动驾驶
未来出行的革新:无人驾驶技术深度解析
在当今科技飞速发展的时代,无人驾驶技术正逐步从科幻走向现实,成为未来交通领域最具革命性的变化之一。本文旨在深入探讨无人驾驶技术的工作原理、关键技术组件以及面临的伦理与法律挑战,并展望其对社会经济和日常生活的深远影响。通过分析感知、决策和执行三个核心环节,本文揭示了无人驾驶汽车如何利用先进的传感器阵列、复杂的算法和精密的机械控制来实现自主行驶。同时,文章也讨论了数据安全、隐私保护及责任归属等问题,呼吁建立相应的法规框架以促进技术的健康发展。最后,无人驾驶技术被预测将为减少交通事故、缓解拥堵、提高能效及推动共享经济等方面带来显著益处,预示着一个更加智能、高效和可持续的出行未来。
|
存储 SQL 分布式计算
MaxCompute 在大规模数据仓库中的应用
【8月更文第31天】随着大数据时代的到来,企业面临着海量数据的存储、处理和分析挑战。传统的数据仓库解决方案在面对PB级甚至EB级的数据规模时,往往显得力不从心。阿里云的 MaxCompute(原名 ODPS)是一个专为大规模数据处理设计的服务平台,它提供了强大的数据存储和计算能力,非常适合构建和管理大型数据仓库。本文将探讨 MaxCompute 在大规模数据仓库中的应用,并展示其相对于传统数据仓库的优势。
397 0
|
C# Windows 监控
WPF应用跨界成长秘籍:深度揭秘如何与Windows服务完美交互,扩展功能无界限!
【8月更文挑战第31天】WPF(Windows Presentation Foundation)是 .NET 框架下的图形界面技术,具有丰富的界面设计和灵活的客户端功能。在某些场景下,WPF 应用需与 Windows 服务交互以实现后台任务处理、系统监控等功能。本文探讨了两者交互的方法,并通过示例代码展示了如何扩展 WPF 应用的功能。首先介绍了 Windows 服务的基础知识,然后阐述了创建 Windows 服务、设计通信接口及 WPF 客户端调用服务的具体步骤。通过合理的交互设计,WPF 应用可获得更强的后台处理能力和系统级操作权限,提升应用的整体性能。
388 0
|
机器学习/深度学习 存储 前端开发
大模型应用框架-LangChain(二)
LangChain由 Harrison Chase 创建于2022年10月,它是围绕LLMs(大语言模型)建立的一个框架,LLMs使用机器学习算法和海量数据来分析和理解自然语言,GPT3.5、GPT4是LLMs最先进的代表,国内百度的文心一言、阿里的通义千问也属于LLMs。LangChain自身并不开发LLMs,它的核心理念是为各种LLMs实现通用的接口,把LLMs相关的组件“链接”在一起,简化LLMs应用的开发难度,方便开发者快速地开发复杂的LLMs应用。 LangChain目前有两个语言的实现:python、nodejs。
|
Java 测试技术
Java IO流深度剖析:字节流和字符流的性能对比!
【6月更文挑战第26天】Java IO流分字节流和字符流,字节流处理所有类型数据(如图片),字符流处理文本(基于Unicode)。字节流直接处理,性能高,适合非文本文件;字符流处理文本时考虑编码,适合文本文件。性能测试显示,字节流在读写非文本文件时更快,而字符流在处理文本时更方便。选择流类型应依据数据类型和需求。
313 0