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; }
写法一和写法二执行:
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; }
执行 :
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日
- 有优惠券:总价打7折,接着减50(假设买的东西不足50,那么商家不会倒贴找钱)。
- 无优惠券:总价打7折
如果是12月12日
- 有优惠券,总价打8折,接着减50(假设买的东西不足50,那么商家不会倒贴找钱)。
- 无优惠券:总价打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; }
执行:
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函数,实现学生成绩的升序排序
关于第④点函数指针
代码实现:
//快速排序 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]); }
以上两个排序的执行结果:
BC40-竞选社长
题目描述
假设你们社团要竞选社长,有两名候选人分别是A和B,社团每名同学必须并且只能投一票,最终得票多的人为社长。
输入描述:
一行,字符序列,包含A或B,输入以字符0结束。
输出描述:
一行,一个字符,A或B或E,输出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; }
写法一二三执行:
c语言刷题训练营第4讲到此结束,感谢大家支持!