【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讲到此结束,感谢大家支持!

相关文章
|
算法 C语言
【C刷题训练营】第四讲(打好基础很重要)(上)
【C刷题训练营】第四讲(打好基础很重要)(上)
154 38
|
3月前
|
算法 数据挖掘 开发者
探索编程之美:从小白到大牛的代码之旅从零到一:我的Python编程之旅
【8月更文挑战第30天】在数字世界的编织中,代码是构成一切的基石。本文将带领读者踏上一段代码探索之旅,从最初的迷茫与困惑,到逐渐找到方向,再到深入理解编程的本质和美学。通过个人的技术感悟和成长历程,我们将一同见证如何通过持续学习、实践和创新,在编程的道路上越走越远。
|
6月前
|
前端开发 程序员 开发工具
2024年最全0基础程序员如何快速进阶成为编程老司机?_码农速成(2),字节跳动面试攻略
2024年最全0基础程序员如何快速进阶成为编程老司机?_码农速成(2),字节跳动面试攻略
2024年最全0基础程序员如何快速进阶成为编程老司机?_码农速成(2),字节跳动面试攻略
|
6月前
|
消息中间件 Java 关系型数据库
首发!阿里面试官总结从零到架构面试宝典,是时候让面试官懵逼了
最近几年公司的大小招聘,社招、校招都有参与,遇到过许多厉害的,也遇到过很多职场小白。
首发!阿里面试官总结从零到架构面试宝典,是时候让面试官懵逼了
|
消息中间件 NoSQL Java
2023年秋招,金九银十Java后端最全面试攻略,吃透25个技术栈
前言 我分享的这份春招,金三银四Java后端开发面试总结包含了JavaOOP、Java集合容器、Java异常、并发编程、Java反射、Java序列化、JVM、Redis、Spring MVC、MyBatis、MySQL数据库、消息中间件MQ、Dubbo、Linux、ZooKeeper、 分布式&数据结构与算法等25个专题技术点,都是小编在各个大厂总结出来的面试真题,已经有很多粉丝靠这份PDF拿下众多大厂的offer,今天在这里总结分享给到大家!
|
设计模式 算法 中间件
劲爆!阿里巴巴面试参考指南(嵩山版)开源分享,程序员面试必刷
近几年受疫情影响各行各业的日子都不好过,虽然程序员日子也挺难,但是好在可以线上面试、线上办公,影响还是比较小的,但是去年教育行业的 “双减” 政策,导致又一大批岗位缺失程序员竞争压力突然递升;
|
SQL 网络协议 算法
Java后端研发实习生面试知识点总结(持续更新中)
Java后端研发实习生面试知识点总结(持续更新中)
358 0
Java后端研发实习生面试知识点总结(持续更新中)
|
缓存 NoSQL 算法
简历:第二章:技术亮点备战
简历:第二章:技术亮点备战
231 0
|
存储 人工智能 运维
心得体会
学习到了诸多知识,提升了自己的能力
|
Java 关系型数据库 MySQL
关于我使用阿里云都心得体会
关于我使用阿里云的心得体会