// 14分代码
#include <bits/stdc++.h>
using namespace std;
int main() {
int hh, mm, ss, C1, C2;
// 读取C1 C2
cin >> C1 >> C2;
ss = (C2 - C1) / 100;
//转换为 hh mm
mm = ss / 60;
hh = mm / 60;
mm %= 60;
// 算出ss 0.5秒以上+ 1 否则向下取整
if(ss % 60 >= 30)
ss = ss % 60 + 1;
else
ss %= 60;
// 两位格式输出
printf("%02d:%02d:%02d", hh, mm, ss);
}
// 全部AC
#include <bits/stdc++.h>
using namespace std;
int main() {
int hh, mm, ss, C1, C2;
// 读取C1 C2
cin >> C1 >> C2;
int tmp = C2 - C1;
// 算出ss 0.5秒以上+ 1 否则向下取整
if(tmp % 100 >= 50)
ss = tmp / 100 + 1;
else
ss = tmp / 100;
hh = ss / 3600, ss %= 3600;
mm = ss / 60, ss %= 60;
// 两位格式输出
printf("%02d:%02d:%02d", hh, mm, ss);
}
最开始以为是s为奇数时候+1了,因为“四舍五入”想到其他题目的解法。但提交错误之后想了想,四舍五入的实质应该是被除数的余数超过除数一半,得到浮点数大于等于0.5时,可以四舍五入。在这想法下,奇偶的四舍五入只能够是其中一个特例。后面算出ss改成用这个方法。
if(ss % 60 >= 30)
ss = ss % 60 + 1;
else
ss %= 60;
但是这样会差最后一个测试点不通过,看了看其他代码,原来要最开始clock转换成ss,打点转换为ss的时候要四舍五入。而不是clock转成ss,ss最后求余得到实际的s,这实际差了一步转换。
if(tmp % 100 >= 50)
ss = tmp / 100 + 1;
else
ss = tmp / 100;
hh = ss / 3600, ss %= 3600;
mm = ss / 60, ss %= 60;
mm = ss / 60, ss %= 60;
hh = mm / 60, mm %= 60;
参考代码(上)的方法是ss直接转换成hh和mm,所以需要从高位到低位转换。但后面想了想,实际上时间转换类似进制转换,这里就是十进制转换成六十进制,所以也可以从低位向高位转换。这可以套模板(下)放进去,感觉写起来方便一点。( 进位的时候除法,当前位求余)