题目链接
先说下本题涉及的一些知识点,也是我在本题中学习到的:
首先是,
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的使用:
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; }