HDOJ 1036 Average is not Fast Enough!

本文解析了一道关于计算跑步平均时间的C++题目,介绍了如何使用floor和ceil函数进行数学运算,以及如何利用sscanf从字符串中读取特定格式的数据。并通过实例展示了四舍五入的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目链接

先说下本题涉及的一些知识点,也是我在本题中学习到的:


首先是,

floor 和ceil的用法

double floor(doublex);

doubleceil(double x);


使用floor函数。floor(x)返回的是小于或等于x的最大整数。
如:    floor(10.5)==10    floor(-10.5)== -11


使用ceil函数。ceil(x)返回的是大于x的最小整数。
如:    ceil(10.5)==11    ceil(-10.5)==-10

    
floor()是向负无穷大舍入,floor(-10.5) == -11;
ceil()是向正无穷大舍入,ceil(-10.5) == -10


然后是 sscanf的使用:

sscanf() - 从一个字符串中读进与指定格式相符的数据
swscanf()- 用于处理宽字符字符串,和scanf功能相同


还有就是一些输出的技巧,正常的%02d 2大家都知道吧,就是输出的宽度,而这里的0可以让输出自动补0,就是输出4他会输出04;

然后说下这道题目,这道题目不难,可是我却做了一下午QAQ,主要是那个题目看了半天给误解了。

输入N是说这个队伍一共跑N次,每次跑距离为D 要求我们根据时间求出多少时间跑1KM 就是 时间 T / D。

但是根据这题,学习到不少基本知识的,详细的在代码注释里:

#include <iostream>
#include <string>
#include <cmath>
using namespace std;
int main()
{
	char s[10]; //用于存储输入时间
	int n,team,HH,MM,SS;
	double d,sum,avg;
	scanf("%d %lf",&n,&d); //输入只有一次
	while(scanf("%d",&team)!=EOF)
	{
		bool flag=false; //用于判断是否是无效的
		sum=0.0;
		for(int i=0;i<n;i++){
			cin>>s;
			if(strcmp(s,"-:--:--")==0)
				flag=true;
			else{ 
				sscanf(s,"%d:%d:%d",&HH,&MM,&SS); //sscanf不能从string到int
				sum += HH*3600.0+MM*60.0+SS*1.0;} //注意进制转换
		}
		if(flag)
			printf("%3d: -\n",team);
		else{
			avg = sum / d;
			int ans = floor(avg + 0.5); //采取四舍五入,不可以直接用ceil应为不是四舍五入
			printf("%3d: %d:%02d min/km\n",team,ans/60,ans % 60);
		} //%02d 就是输出2个宽度并且自动补0
	}
	return 0;
}





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值