天天看点

一天之内分针与时针相遇多少次

有一道面试题:用程序求出一天之内分针与时针相遇多少次。

先来分析一下:

设分针的角速度为大V,时针的角速度为小v,那么它们相遇时一定满足以下条件:

V*t = v*t + 360°*n

其中n为0到无穷大的整数

如果t以小时为单位,那么 V=360°/h,v=30°/h,进而得出:

360*t = 30*t + 360*n

360*t - 30*t = 360*n

330*t = 360*n

t = 360*n/330

而t要满足大于等于0,小于23,所以可用以下代码(以js为例)实现:

var count = 0;
var time = 24;
for(var n=0; n<100000; n++){
  if(360*n/330>=time){ 
    break;
  }
  count++;
}
console.log(time+"小时内时针分针相遇:"+count+"次");
           

输出结果:

  • "24小时内时针分针相遇:22次"

如果需要得出在什么时刻相遇,只需要如下处理:

var count = 0;
var time = 24;
for(var n=0; n<100000; n++){
  var tmpTime = 360*n/330;//
  if(tmpTime>=time){ 
    break;
  }
  console.log("第"+tmpTime+"时时针分针相遇第"+(n+1)+"次");
  count++;
}
console.log(time+"小时内时针分针相遇:"+count+"次");
           

输出结果:

"第0时时针分针相遇第1次"

"第1.0909090909090908时时针分针相遇第2次"

"第2.1818181818181817时时针分针相遇第3次"

"第3.272727272727273时时针分针相遇第4次"

"第4.363636363636363时时针分针相遇第5次"

"第5.454545454545454时时针分针相遇第6次"

"第6.545454545454546时时针分针相遇第7次"

"第7.636363636363637时时针分针相遇第8次"

"第8.727272727272727时时针分针相遇第9次"

"第9.818181818181818时时针分针相遇第10次"

"第10.909090909090908时时针分针相遇第11次"

"第12时时针分针相遇第12次"

"第13.090909090909092时时针分针相遇第13次"

"第14.181818181818182时时针分针相遇第14次"

"第15.272727272727273时时针分针相遇第15次"

"第16.363636363636363时时针分针相遇第16次"

"第17.454545454545453时时针分针相遇第17次"

"第18.545454545454547时时针分针相遇第18次"

"第19.636363636363637时时针分针相遇第19次"

"第20.727272727272727时时针分针相遇第20次"

"第21.818181818181817时时针分针相遇第21次"

"第22.90909090909091时时针分针相遇第22次"

"24小时内时针分针相遇:22次"

还有的题目要求算出一天之内分针与时针垂直的次数有多少,

那么同理可以分析得出:

当分针与时针垂直时一定满足以下条件:

V*t = v*t + 360°*n + 90°

所以

360*t = 30*t + 360*n + 90

360*t-30*t = 360*n + 90

330*t = 360*n + 90

t = (360*n+90)/330

var count=0;
var time = 24;
for(var n=0; n<100000; n++){
  if((360*n+90)/330>=time){
    break;
  }
  count++;
}
console.log(time+"小时内时针分针垂直:"+count+"次");
           

输出结果:

  • "24小时内时针分针垂直:22次"