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


    前言:

            大家好,这是c语言刷题训练营的第四讲,打好基础便于对c语言语法与算法思维的提高,感谢你的来访与支持!

    💥🎈个人主页:​​​​​​Dream_Chaser~ 🎈💥

    ✨✨刷题专栏:http://t.csdn.cn/baIPx

    ⛳⛳本篇内容:c语言刷题训练营 第四讲(牛客网)

    目录

    BC23-时间转换

    解题思路:

    BC24-总成绩和平均分计算

    解题思路:

    BC30-kiki和酸奶

    解题思路:

    BC31-发布会信息

    解题思路:

    BC32-输出学生信息

    解题思路: 

    BC33-计算平均成绩 

    解题思路:

    BC34-进制A+B

    解题思路:

    BC37-网购

    解题思路:

    BC39-争夺前五名

    解题思路:

    BC40-竞选社长 

    解题思路:


    BC23-时间转换

    来源: 时间转换_牛客题霸_牛客网 (nowcoder.com)

    描述

    给定秒数 seconds ,把秒转化成小时、分钟和秒。

    数据范围: 0

    输入描述:

    一行,包括一个整数,即给定的秒数。

    输出描述:

    一行,包含三个整数,依次为输入整数对应的小时数、分钟数和秒数(可能为零),中间用一个空格隔开。

    示例1

    输入:3661
    输出:1  1  1

    解题思路:

    代码实现:

    1. #include <stdio.h>
    2. int main() {
    3. int seconds=0;
    4. scanf("%d",&seconds);
    5. int hour=0,min=0,sec=0;
    6. hour=seconds/3600;
    7. min=seconds%3600/60;
    8. sec=seconds%3600%60;
    9. printf("%d %d %d ",hour,min,sec);
    10. return 0;
    11. }

    执行: 

    中间的部分也可以写成这样:

    BC24-总成绩和平均分计算

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

    题目描述
    依次输入一个学生的 3 科成绩,在屏幕上输出该学生的总成绩以及平均成绩

    输入描述:

    一行, 3 科成绩,成绩之间用一个空格隔开。

    输出描述:

    一行,总成绩和平均成绩(小数点后保留两位),用一个空格隔开。
    示例 1

    输入:79.5 80.0 98.0

    输出:257.50 85.83

    解题思路:

    方法一
    1. #include <stdio.h>
    2. int main() {
    3. double a=0.0,b=0.0,c=0.0;//三科成绩
    4. double sum=0.0;//总成绩
    5. double avg=0.0;//平均分
    6. scanf("%lf %lf %lf",&a,&b,&c);//输入三科
    7. sum=a+b+c;
    8. avg=sum/3;
    9. //输出三科
    10. printf("%.2lf %.2lf",sum,avg);
    11. return 0;
    12. }

    方法二:

    1. int main() {
    2. double score[3] = {0.0};
    3. //输入
    4. scanf("%lf %lf %lf",&score[0],&score[1],&score[2]);
    5. //计算
    6. double sum= score[0] + score[1] + score[2];
    7. double avg= sum/3.0;
    8. //输出
    9. printf("%.2lf %.2lf",sum,avg);
    10. return 0;
    11. }

    方法三:

    1. int main()
    2. {
    3. double score= 0.0;
    4. double sum= 0.0;
    5. //输入并计算
    6. int i= 0;
    7. for( i=0;i<3;i++)
    8. {
    9. scanf("%lf",&score);
    10. sum += score;
    11. }
    12. printf("%.2lf %.2lf\n",sum,sum/3);
    13. return 0;
    14. }

    BC30-kiki和酸奶

    来源:KiKi和酸奶_牛客题霸_牛客网 (nowcoder.com)

    题目描述

            BoBo买了一箱酸奶,里面有n盒未打开的酸奶, KiKi 喜欢喝酸奶,第一时间发现了酸奶。 KiKi h 分钟能喝光一盒酸奶,并且KiKi 在喝光一盒酸奶之前不会喝另一个,那么经过 m 分钟后还有多少盒未打开的酸奶?
    输入描述:
    多组输入,每组输入仅一行,包括 n h m (均为整数)。输入数据保证 m <= n * h

    输出描述

    针对每组输入,输出也仅一行,剩下的未打开的酸奶盒数。
    示例 1
    输入: 8 5 16
    输出:  4

    解题思路:

    方法一:

    1. 每组输入记得写上while(scanf() ! = EOF)
    2. 剩下的未打开的酸奶盒数,实际的等于 已喝完的酸奶盒数(m / h) + 已打开的酸奶盒数(m % h)

    图解:

     代码实现:

    1. #include <stdio.h>
    2. int main() {
    3. int n = 0;//给的酸奶数
    4. int h = 0;///盒,喝一瓶酸奶的时间
    5. int m = 0;//总共给的时间
    6. //多组输入
    7. while (scanf("%d %d %d", &n, &h, &m) != EOF)
    8. {
    9. n = n - (m / h + m % h);//剩下未打开的酸奶盒数
    10. }
    11. printf("%d", n);
    12. return 0;
    13. }

    执行: 

    方法二: 

    n = 0;//给的酸奶数

    h = 0;// 分/盒,喝一瓶酸奶的时间
    m = 0;//总共给的时间

    以n为8 ,h为5,m为16,为例子

    当 m % h  不为 0 时,表示在16分钟的时间内,16 % 5 商为3,余1 ,则说明3瓶全喝完了,还剩个1瓶已经打开了,还没喝完

    以n为8 ,h为4,m为16,为例子

    当 m % h  为 0 时,表示在16分钟的时间内,16 % 4 商为4 ,则说明4瓶全喝完了 ,也没有打开的但未喝完的酸奶。

    1. int main() {
    2. int n = 0;//给的酸奶数
    3. int h = 0;///盒,喝一瓶酸奶的时间
    4. int m = 0;//总共给的时间
    5. while (scanf("%d %d %d", &n, &h, &m) != EOF)
    6. {
    7. if (m % h)//不为0,说明有打开但未喝完的酸奶
    8. {
    9. printf("%d\n", n - m / h - 1);
    10. }
    11. else//0,则说明在m分钟内全部喝完了
    12. {
    13. printf("%d\n", n - m / h);
    14. }
    15. }
    16. return 0;
    17. }

     执行: 

    BC31-发布会信息

    来源:发布信息_牛客题霸_牛客网 (nowcoder.com)

    题目描述 
    你的手机丢了,在屏幕上输出信息告诉大家
    输入描述:
    输出描述 :
    I lost my cellphone!

    解题思路:

    直接把输出描述复制一下,粘贴到printf函数内打印即可

    代码实现:

    1. #include
    2. int main()
    3. {
    4. printf("I lost my cellphone!\n");
    5. return 0;
    6. }

    执行: 

    BC32-输出学生信息

    来源:输出学生信息_牛客题霸_牛客网 (nowcoder.com)

    题目描述
    学生信息管理系统是学校教学管理的重要工具,现有一名学生基本信息如下:姓名 -Jack ,年龄 -18 ,性别-Man ,请按照输出样例的格式输出该学生的信息。

    输入描述:

    输出描述 :
    输出分为三行,分别为标题行,分隔行,信息行。
    第一行,标题行,每个标题之间间隔 4 个空格。
    第二行,分隔行,一共 21 个减号 "-"
    第三行,信息行,每列输出信息和标题首字母对齐。输出样例如下:
    Name   Age   Gender
    ---------------------
    Jack   18     man

    解题思路: 

    代码实现:

    1. #include
    2. int main() {
    3. printf("Name Age Gender\n");
    4. printf("---------------------\n");
    5. printf("Jack 18 man\n");
    6. return 0;
    7. }

     代码执行:

    BC33-计算平均成绩 

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

    题目描述
    从键盘输入 5 个学生的成绩(整数),求他们的平均成绩(浮点数,保留一位小数)
    输入描述 :
    一行,连续输入 5 个整数(范围 0~100 ),用空格分隔。

    输出描述:

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

    示例 1
    输入 75 80 43 67 96
    输出 72.2

    解题思路:

    写法一:
    1. int main() {
    2. int num[5] = {0};
    3. int i = 0;
    4. //输入
    5. for (i = 0; i < 5; i++)
    6. {
    7. scanf("%d", &num[i]);
    8. }
    9. //求和
    10. int sum = 0;
    11. for (i = 0; i < 5; i++) {
    12. sum = sum + num[i];
    13. }
    14. //输出
    15. printf("%.1lf", sum / 5.0);
    16. return 0;
    17. }

    写法二:

    1. int main() {
    2. int i = 0;
    3. int num = 0;
    4. int sum=0;
    5. //输入
    6. for (i = 0; i < 5; i++)
    7. {
    8. scanf("%d", &num);
    9. //求和
    10. sum+=num;
    11. }
    12. //输出
    13. printf("%.1lf", sum / 5.0);
    14. return 0;
    15. }

    写法一和写法二执行:

     题目描述

    输入一个十六进制数 a ,和一个八进制数 b ,输出 a+b 的十进制结果(范围 -231~231-1 )。
    输入描述 :
    一行,一个十六进制数 a ,和一个八进制数 b ,中间间隔一个空格。

    示例1

    输入 0x12 05 

    输出 23
    备注 :
    十六进制 Hexadecimal 一般以 0x 开头,例如 0xFF 。八进制 Octal ,一般以 0 开头,例如 07

    解题思路:

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

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

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

    执行 :

    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折。

    代码实现: 

    1. #include <stdio.h>
    2. int main() {
    3. double price=0.0;
    4. int mon=0,days=0;
    5. int flag=0;
    6. scanf("%lf %d %d %d",&price,&mon,&days,&flag);
    7. //条件是1111日,有优惠券
    8. if(mon==11&&days==11 && flag==1)
    9. {
    10. //价格打7折,减50
    11. price=price*0.7 - 50;
    12. //50块的券可以直接当作钱来付款,如果买的东西的价格不足50,商家不会找钱
    13. if(price<0)
    14. {
    15. price=0;
    16. }
    17. }
    18. //条件是1111日,无优惠券
    19. else if(mon==11&&days==11 && flag==0)
    20. { //价格打7
    21. price=price*0.7;
    22. }
    23. //条件是1212日,有优惠券
    24. else if(mon==12&&days==12 && flag==1)
    25. {
    26. //价格打8折,减50
    27. price= price*0.8-50;
    28. //50块的券可以直接当作钱来付款,如果买的东西的价格不足50,商家不会找钱
    29. if(price<0)
    30. {
    31. price=0;
    32. }
    33. }
    34. //条件是1212日,无优惠券
    35. else if(mon==12&&days==12 && flag==0)
    36. {
    37. price = price*0.8;
    38. }
    39. //保留小数点后两位
    40. printf("%.2lf",price);
    41. return 0;
    42. }

    方法二:简化的写法

    定义变量

    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

    代码实现:

    1. int main()
    2. {
    3. double price=0.0;//价格
    4. int mon=0,days=0;//月,日
    5. int flag=0;//是否有优惠券
    6. double cut=1.0;//折扣
    7. double last=0.0;//实际花钱数
    8. //输入
    9. scanf("%lf %d %d %d",&price,&mon,&days,&flag);
    10. //11打七折
    11. if(mon==11&&days==11)
    12. {
    13. cut=0.7;
    14. }
    15. //128
    16. else if(mon==12 && days==12)
    17. {
    18. cut=0.8;
    19. }
    20. //实际花出去的钱数 = 总价 * 折扣 - 优惠券(500)
    21. last= price * cut - flag * 50;
    22. //如果花出去的钱小于0,那么商家不会倒贴,直接0元购
    23. if(last<0.0)
    24. {
    25. printf("%.2lf\n",0.0);
    26. }
    27. //否则大于0,那就直接返回last
    28. else
    29. {
    30. printf("%.2lf\n",last);
    31. }
    32. return 0;
    33. }

    执行:

    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博客

    代码实现:

    1. #include<stdio.h>
    2. //冒泡排序
    3. int main() {
    4. int n = 0;//学生成绩的数量
    5. int arr[40] = { 0 };//存储成绩的数组
    6. int i = 0;
    7. scanf("%d", &n);
    8. for (i = 0; i < n; i++)
    9. {
    10. scanf("%d", &arr[i]);//输入每个学生的成绩
    11. }
    12. //冒泡排序
    13. for (i = 0; i < n - 1; i++)
    14. {
    15. int j = 0;
    16. int tmp = 0;
    17. for (j = 0; j < n - 1 - i; j++)
    18. {
    19. if (arr[j] > arr[j + 1])
    20. {
    21. tmp = arr[j];
    22. arr[j] = arr[j + 1];
    23. arr[j + 1] = tmp;
    24. }
    25. }
    26. }
    27. for (i = n - 1; i >= n - 5; i--)//注意这个地方i的范围,初值,以及判断条件
    28. {
    29. printf("%d ", arr[i]);
    30. }
    31. return 0;
    32. }

    ②快速排序

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

    关于第④点函数指针

    代码实现:

    1. //快速排序
    2. int cmp_int(const void* e1, const void* e2)
    3. {
    4. return *(int*)e1 - *(int*)e2;
    5. }
    6. int main() {
    7. //输入
    8. int n = 0;//个数
    9. int arr[40] = { 0 };//存放的是成绩
    10. int i = 0;
    11. scanf("%d", &n);
    12. for (i = 0; i < n; i++)
    13. {
    14. scanf("%d", &arr[i]);
    15. }
    16. //排序 - 升序 - 5个元素 - 就是最高的前5个成绩
    17. //qsort - C语言库函数
    18. qsort(arr, n, 4, cmp_int);
    19. for (i = n - 1; i >= n - 5; i--)//注意这个地方i的范围,初值,以及判断条件
    20. {
    21. printf("%d ", arr[i]);
    22. }
    23. return 0;
    24. }

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

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

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

    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'。

    1. int main() {
    2. char buf[100]={0};
    3. //输入
    4. gets(buf);
    5. //统计
    6. int count_a = 0;
    7. int count_b = 0;
    8. int i=0;
    9. while(buf[i]!='0')
    10. {
    11. if(buf[i] =='A')
    12. {
    13. count_a++;
    14. }
    15. if(buf[i]=='B')
    16. {
    17. count_b++;
    18. }
    19. i++;
    20. }
    21. //输出
    22. if(count_a > count_b)
    23. {
    24. printf("A\n");
    25. }
    26. else if(count_a < count_b)
    27. {
    28. printf("B\n");
    29. }
    30. else
    31. {
    32. printf("E\n");
    33. }
    34. return 0;
    35. }

    写法二:

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

    1. int main()
    2. {
    3. char buf[100] = {0};
    4. //输入
    5. gets(buf);
    6. //统计
    7. int flag=0;
    8. int i=0;
    9. while(buf[i]!='0')
    10. {
    11. if(buf[i] == 'A')
    12. {
    13. flag++;
    14. }
    15. if(buf[i] == 'B')
    16. {
    17. flag--;
    18. }
    19. i++;
    20. }
    21. //输出
    22. if(flag>0)
    23. {
    24. printf("A\n");
    25. }
    26. else if(flag<0)
    27. {
    28. printf("B\n");
    29. }
    30. else
    31. {
    32. printf("E\n");
    33. }
    34. return 0;
    35. }

    写法三:

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

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

    其它思路基本不变。

    1. int main()
    2. {
    3. //输入
    4. int ch = 0;
    5. int flag = 0;
    6. while (((ch = getchar()) != '0') && ch != EOF)
    7. {
    8. if (ch == 'A')
    9. {
    10. flag++;
    11. }
    12. if (ch == 'B')
    13. {
    14. flag--;
    15. }
    16. }
    17. if (flag > 0)
    18. {
    19. printf("A\n");
    20. }
    21. else if (flag < 0)
    22. {
    23. printf("B\n");
    24. }
    25. else
    26. {
    27. printf("E\n");
    28. }
    29. return 0;
    30. }

    写法一二三执行:

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

  • 相关阅读:
    Jupyter Notebook与Pycharm代码连接Docker容器中的远程服务器运行
    leetcode做题笔记2736. 最大和查询
    【SpringCloud学习笔记】服务提供者,服务消费者
    20231016比赛总结
    搭建强化学习的机械臂MuJoCo环境以及urdf转xml文件方法
    C高级day2
    机器学习 | 过拟合&欠拟合
    Hive sql 行列转换(行转列,列转行)
    python系列教程184——尽量少用全局变量
    猿创征文|嵌入式高效开发5款工具推荐!
  • 原文地址:https://blog.csdn.net/weixin_65186652/article/details/132803192