我最近接受了这个采访问题:
给定12小时模拟时钟,以度为单位计算小时和分针之间的较小角度。尽可能精确。
我想知道什么是最简单,最可读,最精确的算法。欢迎使用任何语言的解决方案(但如果您认为有必要,请稍微解释一下)。
答案 0 :(得分:42)
事实证明维基百科确实有最好的答案:
// h = 1..12, m = 0..59
static double angle(int h, int m) {
double hAngle = 0.5D * (h * 60 + m);
double mAngle = 6 * m;
double angle = Math.abs(hAngle - mAngle);
angle = Math.min(angle, 360 - angle);
return angle;
}
基本上:
0.5
度6
度问题解决了。
精度不是问题,因为小数部分是.0
或.5
,并且在0..360
范围内,所有这些值都可以在{{1}中精确表示}}
答案 1 :(得分:8)
为了找到时钟指针之间的角度,
30 * [HRS - (MIN/5)] + (MIN/2)
答案 2 :(得分:5)
polygenlubricants与我的相似的java代码。我们假设时钟是12小时而不是24小时。
如果是24小时,那就是另一回事了。另外,另一个假设是假设我们在计算时停止时钟。
一个时钟周期为360度。
分针每分钟可以运行多少度? 360/60 =每分钟6度。
每小时每小时运行多少度? 360/12 =每小时30度(因为时针比分钟慢)
由于单位计算更容易,“分钟”,让我们得到
“每分钟可以运行多少度?”
30/60 =每分钟0.5度。
所以,如果你知道如何获得这些数字,那么解决方案就完全解决了这个问题。
答案 3 :(得分:1)
试试这段代码:
import java.util.Scanner;
class Clock{
public static void main(String args[]){
int hours,mins;
System.out.println("Enter the Time(hours) : ");
Scanner dx = new Scanner(System.in);
hours = dx.nextInt();
System.out.println("Enter the time(mins) : ");
Scanner fx = new Scanner(System.in);
mins = fx.nextInt();
if(hours>=0 && hours<=12){
if(mins>=0 && mins<=59){
double hDegrees = (hours * 30) + (mins * 0.5);
double mDegrees = mins * 6;
double diff = Math.abs(hDegrees - mDegrees);
System.out.println("The angle between sticks is (degrees) : "+diff);
if (diff > 180){
diff = 360 - diff;
System.out.println("The angle between sticks is (degrees) : "+diff);
}
}
}
else{
System.out.println("Wrong input ");
}
}
}
答案 4 :(得分:1)
分钟角度(从12点开始):360 *分钟/ 60
小时角度(从12点开始):360 *(小时%12)/ 12 + 360 *(分钟/ 60)*(1/12)
小时和分钟之间的角度 :(小时角 - 分钟角)%360 通过简单的算术,这可以减少到30 *小时 - 5.5 *分钟。
答案 5 :(得分:1)
**php code for find angle via time (minutes and hour's)**
echo calcAngle(3,70);
function calcAngle($h, $m)
{
// validate the input
if ($h <0 || $m < 0 || $h >12 || $m > 60)
{
return "Wrong input";
}
else {
if ($h == 12) $h = 0;
if ($m == 60) $m = 0;
$hour_angle = 0.5 * ($h*60 + $m);
$minute_angle = 6*$m;
$angle = abs($hour_angle - $minute_angle);
$angle = min(360-$angle, $angle);
return $angle;
}
}
答案 6 :(得分:0)
问题被称为“Clock Angle Problem”,我们需要在特定时间找到模拟时钟的指针(时针和分针)之间的角度。
C编程语言解决方案。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
#include<inttypes.h>
#include<assert.h>
#define STRING_LENGTH 6
double angle_between_hour_min_hand(char[]);
int main(void) {
uint8_t test;
printf("Enter the number of test cases\n");
scanf("%"SCNu8,&test);
assert(test>0);
while(test--) {
char time_digital[STRING_LENGTH];
printf("Enter the time\n");
scanf("%s",time_digital);
double angle_between_hands_deg = angle_between_hour_min_hand(time_digital);
abs(angle_between_hands_deg) < angle_between_hands_deg ? printf("%0.1f\n",angle_between_hands_deg) : printf("%d\n",abs(angle_between_hands_deg));
}
return 0;
}
double angle_between_hour_min_hand(char time_digital[]) {
uint8_t hr,min;
double hr_angle_deg,min_angle_deg,angle_between_hands_deg;
char*buffer = calloc(sizeof(char),STRING_LENGTH);
if(buffer) {
snprintf(buffer,STRING_LENGTH,"%s",time_digital);
hr = atoi(__strtok_r(buffer,":",&buffer));
min = atoi(__strtok_r(NULL,":",&buffer));
buffer -= strlen(time_digital);
free(buffer);
hr_angle_deg = (double)(30*hr) + (double) (0.5*min);
// printf("hr-angle: %f\n", hr_angle_deg);
min_angle_deg = 6*min;
// printf("min-angle: %f\n", min_angle_deg);
angle_between_hands_deg = (hr_angle_deg > min_angle_deg) ? hr_angle_deg - min_angle_deg : min_angle_deg - hr_angle_deg;
if(angle_between_hands_deg > 180) {
angle_between_hands_deg = 360 - angle_between_hands_deg;
}
}
else fprintf(stderr,"Memory not allocated to the buffer pointer!\n");
return angle_between_hands_deg;
}
在您的系统中编译以上程序,我使用的是 Ubuntu 18.04 LTS Bionic Beaver ,您可以使用任何安装了C编译器的系统。
gcc -Wall -g clock_angle_sol.c -o clock_angle_sol
./clock_angle_sol
Enter the time in 12-hour or 24 hour i.e (hr:min) format: 12:45
Angle: 112.00 degrees.
注释:
1.等式将为您提供12小时制时针所成的角度。
2.如果要计算24小时制时针所成的角度,请使用以下公式:
3.秒针也有助于分针的旋转,但我们忽略了它,因为该贡献微不足道,即1/10 = 0.1。
答案 7 :(得分:-1)
这是一个解决方案(C#)。这是一个非常简单的解决方案,忽略了精度。希望解决方案是自我解释的。
public static double GetAngle(int hourHand, int minuteHand)
{
double oneMinuteAngle = (360 / 60);
double oneHourAngle = (360 / 12);
double hourAngle = oneHourAngle * hourHand;
double minuteAngle = oneMinuteAngle * minuteHand;
return (Math.Abs(hourAngle - minuteAngle));
}
答案 8 :(得分:-3)
我不知道它是否正确,。这样的东西?
//m*360/60 - (h*360/24)+(m*360/(24*60)) ->
t = abs(25*m - 60*h)/4
t = min(t,360-t)
答案 9 :(得分:-3)
用于找到时针和分针之间的角度
angle=(hour*5-min)*6