(学习自用)
一、题目
读取四个整数 A,B,C,D用来表示游戏的开始时间和结束时间。
其中 A 和 B 为开始时刻的小时和分钟数,C 和 D 为结束时刻的小时和分钟数。
请你计算游戏的持续时间。
比赛最短持续 1 分钟,最长持续 24小时。
输入格式
共一行,包含四个整数 A,B,C,D
输出格式
输出格式为 O JOGO DUROU X HORA(S) E Y MINUTO(S)
,表示游戏共持续了 X小时 Y 分钟。
输入样例1:
7 8 9 10
输出样例1:
O JOGO DUROU 2 HORA(S) E 2 MINUTO(S)
输入样例2:
7 7 7 7
输出样例2:
O JOGO DUROU 24 HORA(S) E 0 MINUTO(S)
输入样例3:
7 10 8 9
输出样例3:
O JOGO DUROU 0 HORA(S) E 59 MINUTO(S)
法一:
一项一项列举
1.当结束时间的小时(c)小于开始时间小时(a)时
24-a+c
2.当结束时间的分钟(d)小于开始时间分钟(b)时
60-d-b同时要给小时位-1,因为这里的60分钟是借来的
#include <iostream>
using namespace std;
int main() {
int a,b,c,d;
cin>>a>>b>>c>>d;
if (a<c&&b<=d) cout<<"O JOGO DUROU "<<c-a<<" HORA(S) E "<<d-b<<" MINUTO(S)";
if (a<c&&b>d) cout<<"O JOGO DUROU "<<c-a-1<<" HORA(S) E "<<d+60-b<<" MINUTO(S)";
if (a>c&&b<d) cout<<"O JOGO DUROU "<<24-a+c<<" HORA(S) E "<<d-b<<" MINUTO(S)";
if (a>c&&b>d) cout<<"O JOGO DUROU "<<c+24-a-1<<" HORA(S) E "<<60-b+d<<" MINUTO(S)";
if (a==c&&b<d) cout<<"O JOGO DUROU "<<a-c<<" HORA(S) E "<<d-b<<" MINUTO(S)";
if (a==c&&b>d) cout<<"O JOGO DUROU "<<a-c+24-1<<" HORA(S) E "<<d+60-b<<" MINUTO(S)";
if (a==c&&b==d) cout<<"O JOGO DUROU "<<a-c+24<<" HORA(S) E "<<b-d<<" MINUTO(S)";
return 0;
}
法二:
#include <iostream>
using namespace std;
int main()
{
int a, b, c, d;
cin >> a >> b >> c >> d;
if(d < b) //注意判断分钟要放在判断小时前
{ //例如 7 11 7 10,这里先判断分钟d<b所以c—1=6,这时在去判断小时,这时c<a就加24
c -= 1;
d += 60;
}
if(c < a) c += 24;
if(c - a == 0 && d - b == 0) c += 24; // 特判,这种情况表示过了一天
printf("O JOGO DUROU %d HORA(S) E %d MINUTO(S)",c-a,d-b);
}
法三:
直接换成分钟计算,计算完在换回
#include <iostream>
using namespace std;
int main()
{
int a, b, c, d, minute1, minute2;
cin >> a >> b >> c >> d;
minute1 = a * 60 + b;
minute2 = c * 60 + d;
int hour = 0, minute = 0;
int dec = minute2 - minute1;
if(dec == 0)
{
hour = 24;
minute = 0;
}
else
{
if(dec < 0) //如 22:00 到 5:00
{
dec += 24 * 60; //dec计算的是5点到22点的时间,共17小时。故应用一天的分钟(24*60)减去,才是正确经历的分钟
}
hour = dec / 60;
minute = dec % 60;
}
cout << "O JOGO DUROU " << hour << " HORA(S) E " << minute << " MINUTO(S)";
return 0;
}
法二、三来自acwing 668题解