如果您在给定时间启动12小时模拟时钟,并在另一个给定时间停止,则分针超过时针的次数是多少次?
或多或少我知道怎么做,但那些特殊情况是什么?
我有这样的事情:
#include<cstdio>
#include<cmath>
int main()
{
int t,h1,m1,i,h2,m2,count,j,j1,j2;
scanf("%d",&t);
while(t--)
{
scanf("%d:%d",&h1,&m1);
scanf("%d:%d",&h2,&m2);
if(h1==0 && m1==0)
m1+=1;
count=0;
if(h1==h2)
{
if(h1>=12)
j=(60*(h1-12))/11;
else
j=(60*h1)/11;
if(j>=m1 && j<m2)
count++;
}
else
{
for(i=h1+1;i<h2;i++)
{
if(i!=11 && i!=23)
count++;
}
if(h1>=12)
j1=(60*(h1-12))/11;
else
j1=(60*h1)/11;
if(j1>=m1 && j1<=59)
count++;
if(h2>=12)
j2=(60*(h2-12))/11;
else
j2=(60*h2)/11;
if(j2<m2 && j2<=59)
count++;
}
printf("%d\n",count);
}
return 0;
}
但是,我的一些测试代码返回了一个糟糕的结果:(
例如:
22:00 02:00
我的代码应该返回3,但它返回18
答案 0 :(得分:1)
这是一种使用分针和时针之间角速度差异的算法:
#include <iostream>
#include <cmath>
using namespace std;
int main(){
int H1, M1, H2, M2, answer;
double time1, time2;
char smiec;
while (cin >> H1 >> smiec >> M1 >> H2 >> smiec >> M2){
H2 = H2 < H1 ? H2 + 24 : H2;
time1 = H1 + M1/60.0;
time2 = H2 + M2/60.0;
answer = floor(11/12.0 * time2) - floor(11/12.0 * time1);
cout << answer << endl;
}
}
答案 1 :(得分:0)
交叉路口将发生在: 12:00,01:05,02:10,03:16,04:21,05:27,06:32,07:38,08:43,09: 49,10:54 。
我认为如果它们相交或不相交,更好的方法是计算时间列表。首先对输入数据进行标准化,然后再制作计算它的算法。否则,你应该深入研究几何和数学中的等式问题。
计数方法会产生类似的优化算法,因为你的最大范围不超过24小时,每次输入都有一个恒定的时间。
如果您还想使用这种方法,那么通过检查T1的约束是否总是小于T2,您的代码会更好。例如:
int H1, M1, H2, M2;
double vd, vm, ratio, t, t1, t2, spot;
char smiec;
while (cin >> H1 >> smiec >>M1 >> H2 >> smiec >> M2)
{
ratio = 720 / 11;
t1 = H1 * 60 + M1;
t2 = H2 * 60 + M2;
if (t2 < t1)
t2 += 24 * 60;
t = t2 - t1;
spot = floor(abs(t / ratio));
cout << spot << endl;
}