时钟算法的任务

时间:2015-10-17 19:37:30

标签: algorithm

如果您在给定时间启动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

2 个答案:

答案 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;
}