🔥个人主页:@草莓熊Lotso
🎬作者简介:C++研发方向学习者
📖个人专栏: 《C语言》 《数据结构与算法》《C语言刷题集》
⭐️人生格言:生活是默默的坚持,毅力是永久的享受。
前言:本篇博客是刷题集中的第四篇,题目都是一些比较基础的IO型题目,适合C语言初学者。特别声明一下,这里提供的答案和思路都并非唯一,仅供参考。
目录
1.时间转换
题目链接:时间转换_牛客题霸_牛客网
题目描述:
题目示例:
代码演示:
#include <stdio.h>
int main()
{
int seconds=0;
scanf("%d",&seconds);
int h=seconds/3600;
int temp=seconds%3600;
int m=temp/60;
int s=temp%60;
printf("%d %d %d",h,m,s);
return 0;
}
题目解析:
- 这题我这里先利用seconds除3600得到小时数
- 再用seconds%3600得到剩余的用temp存起来,再把它除60就是分钟,%60就是秒
2.总成绩和平均分计算
题目链接:总成绩和平均分计算_牛客笔试题_牛客网
题目描述:
题目示例:
代码演示:
#include <stdio.h>
int main()
{
double sub_one=0.0;
double sub_two=0.0;
double sub_three=0.0;
scanf("%lf %lf %lf",&sub_one,&sub_two,&sub_three);
double sum=sub_one+sub_two+sub_three;
double aver=sum/3.0;
printf("%.2f %.2f",sum,aver);
return 0;
}
优化后代码:
#include <stdio.h>
int main() {
int i = 0;
float sum = 0.0;
float avg = 0.0;
float score = 0.0;
for (i = 0; i < 3; i++)
{
scanf("%f", &score);
sum += score;
}
avg=sum / 3.0;
printf("%.2f %.2f\n", sum, avg);
return 0;
}
题目解析:
- 我们通过对比两个代码可以发现,在输入的过程中就可以把成绩加起来,不需要等到输入完后再加,最后求平均分直接除3.0就行了
- 然后这题用floa类型t和double类型都可以
3. KiKi喝酸奶
题目链接:KiKi和酸奶_牛客题霸_牛客网
题目描述:
题目示例:
代码演示:
#include <stdio.h>
int main()
{
int n=0;
int h=0;
int m=0;
while(scanf("%d %d %d",&n,&h,&m)!=EOF)
{
int sum=m/h;
if(m%h==0)
{
printf("%d",n-sum);
}
else {
printf("%d",n-(sum+1));
}
}
return 0;
}
题目解析:
- 根据题意定义了一个sum变量等于m/h,表示我m分钟喝了多少瓶,这时候就需要分情况讨论了
- 如果m%h刚好为0就表示没有多打开的,如果不为0就证明打开了一瓶,只不过没有喝完,所以后面求剩的时候就得多减个1
4.发布信息
题目链接:发布信息__牛客网
题目描述:
代码演示:
#include <stdio.h>
int main()
{
printf("I lost my cellphone!");
return 0;
}
题目解析:
- 这题可以说是太简单了,直接打印就行,就没啥好说的了
5.输出学生信息
题目链接:输出学生信息_牛客笔试题_牛客网
题目描述:
代码演示:
#include <stdio.h>
int main()
{
printf("Name Age Gender\n");
printf("---------------------\n");
printf("Jack 18 man\n");
return 0;
}
题目解析:
- 这题也很简单,直接按照题目所给要求打印就行了,注意格式控制
6.计算平均成绩
题目链接:计算平均成绩__牛客网
题目描述:
题目描述:
代码演示:
#include <stdio.h>
int main()
{
int input=0;
int sum=0;
for (int i=0;i<5;i++)
{
scanf("%d",&input);
sum+=input;
}
double ave=sum/5.0;
printf("%.1f",ave);
return 0;
}
题目解析:
- 这题我们可以发现恨上面有一题十分类似,直接在输入的时候加起来,最后再单独求平均数就可以了
7.进制A+B
题目链接:进制A+B_牛客题霸_牛客网
题目描述:
题目示例:
代码演示:
#include <stdio.h>
int main()
{
int a=0;
int b=0;
scanf("%x %o",&a,&b);
int sum=a+b;
printf("%d",sum);
return 0;
}
题目解析:
首先要理解十进制、十六进制、八进制只是一种数据的表示形式,不是数据的存储形式- 不同格式的数据的输出在C语言中有不同的格式指定,比如:%x是十六进制格式,%o就是八进制格式
- 不同进制的数据存放都整形变量中都是整形值,直接计算就行
8.网购
题目链接:网购_牛客题霸_牛客网
题目描述:
题目示例:
代码演示:
#include <stdio.h>
int main()
{
double price=0.0;
int m=0;
int d=0;
int discount=0;
scanf("%lf %d %d %d",&price,&m,&d,&discount);
if(m==11&&d==11)
{
price=price*0.7;
if(discount==1)
{
price=price-50;
}
}
if(m==12&&d==12)
{
price=price*0.8;
if(discount==1)
{
price=price-50;
}
}
if(price<0.0)
{
price=0.0;
}
printf("%.2lf",price);
return 0;
}
#include <stdio.h>
int main()
{
double price=0.0;
int m=0;
int d=0;
int discount=0;
scanf("%lf %d %d %d",&price,&m,&d,&discount);
if(m==11&&d==11)
{
price=price*0.7;
}
if(m==12&&d==12)
{
price=price*0.8;
}
price-=discount*50;
if(price<0.0)
{
price=0.0;
}
printf("%.2lf",price);
return 0;
}
题目解析:
- 上述两种方法都是可以的,这题只要按照题目要求给定折扣就可以了,然后第二种方法的话更加简略一点,大家可以自己对比起来看看;
- 注意如果最后价格算出来小于0肯定是不行的,直接让它等于0就可以
9.争夺前五名
题目链接:争夺前五名_牛客题霸_牛客网
题目描述:
题目示例:
代码演示:
--这题我会给三种方式,我个人更喜欢第三种,然后第二种是对第一种的优化,具体优化了啥注意看注释
方法1:这里是直接求的降序,正着打印就行,其实也可以升序后逆着打印,这里就不演示了
#include <stdio.h>
#include<stdlib.h>
int int_cmp(const void* p1, const void* p2) {
return ((*(int*)p2) - (*(int*)p1));
}
int main() {
int n = 0;
int arr[50] = {0};
scanf("%d\n", &n);
for (int i = 0; i < n; i++) {
scanf("%d ", &arr[i]);
}
for(int i=0;i<n-1;i++)
{
for(int j=1;j<n-i;j++)
{
if(arr[j-1]<arr[j])
{
int temp=arr[j-1];
arr[j-1]=arr[j];
arr[j]=temp;
}
}
}
for (int i = 0; i < 5; i++) {
printf("%d ", arr[i]);
}
return 0;
}
方法2:如果在其中一趟的时候已经有序,就不用比了直接跳出
#include <stdio.h>
#include<stdlib.h>
int int_cmp(const void* p1, const void* p2) {
return ((*(int*)p2) - (*(int*)p1));
}
int main() {
int n = 0;
int arr[50] = {0};
scanf("%d\n", &n);
for (int i = 0; i < n; i++) {
scanf("%d ", &arr[i]);
}
for(int i=0;i<n-1;i++)
{
int flag=1;//假设有序
for(int j=1;j<n-i;j++)
{
if(arr[j-1]<arr[j])
{
int temp=arr[j-1];
arr[j-1]=arr[j];
arr[j]=temp;
flag=0;//只要交换过就证明还是无序的
}
}
if(flag==1)
{
break;//这一趟已经有序了,跳出循环
}
}
for (int i = 0; i < 5; i++) {
printf("%d ", arr[i]);
}
return 0;
}
方法3:直接用库函数qsort进行排序
#include <stdio.h>
#include<stdlib.h>
int int_cmp(const void*p1,const void*p2)
{
return((*(int*)p2)-(*(int*)p1));//降序用p2-p1
}
int main() {
int n=0;
int arr[50]={0};
scanf("%d\n",&n);
for(int i=0;i<n;i++)
{
scanf("%d ",&arr[i]);
}
qsort(arr,n,4,int_cmp);
for(int i=0;i<5;i++)
{
printf("%d ",arr[i]);
}
return 0;
}
题目解析:
- 本题以上三种方法都可以,如果会用qsort函数可以直接用,不会的话也可以自己来实现冒泡排序,自己实现的话建议使用第二种这种优化过的。
- 如果想要学习qsort函数的可以点击下面的链接看看这篇博客
往期回顾:
结语: 本篇文章就到此结束了,C语言刷题集专栏中的第四篇的题目就会比之前几篇困难一些了,涉及到了更过的知识点以及一些方法的应用,后面的难度肯定也是会递增的,但其实也都是比较基础的编程题,非常适合刚学完C语言的朋友们拿来练手,提升自己的代码能力。