2010-05-01 30 views
33

Me dieron esta pregunta entrevista reciente:ángulo entre hora y los minutos en un reloj analógico

Dado un reloj analógico de 12 horas, calcular el grado en el ángulo más pequeño entre la hora y los minutos. Sea tan preciso como pueda.

Me pregunto cuál es el algoritmo más simple, más legible y más preciso. La solución en cualquier idioma es bienvenida (pero explique un poco si cree que es necesario).

+9

más simple? buscándolo en wiki! : http://en.wikipedia.org/wiki/Clock_angle_problem ' –

+4

Creo que este es un problema puramente matemático, y también bastante trivial. No veo cómo esta pregunta puede obtener cuatro votos positivos ... –

Respuesta

41

Resulta que Wikipedia tiene la mejor respuesta:

// 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; 
} 

Básicamente:

mano
  • La hora se mueve a la velocidad de 0.5 grados por minuto
  • el minuto la mano se mueve a la tasa de 6 grados por minuto

Problema resuelto.


y la precisión no es una preocupación porque la parte fraccionaria es bien .0 o .5, y en el rango de 0..360, todos estos valores son exactamente representable en double.

+1

Esto no es del todo correcto para h> = 12. – starblue

+1

@starblue: He aclarado que es un reloj analógico de 12 horas. – polygenelubricants

+17

@starblue ¿Puede el reloj analógico ser alguna vez las 24 horas? – AksharRoop

-3

No sé si es correcto, ¿algo como esto?

//m*360/60 - (h*360/24)+(m*360/(24*60)) -> 
t = abs(25*m - 60*h)/4 
t = min(t,360-t) 
+0

Bueno, no puede ser correcto si te falta un paréntesis final: D – Ponkadoodle

+0

Para 'h = 3',' m = 0', obtengo '45'. Debería ser '90'. – polygenelubricants

+0

@poly de acuerdo, olvidé que el reloj normal es de 12, no de 24 horas. si reemplazas la división por 24 con 12, deberías obtener la correcta – Anycorn

4

El código java de los poligenubricantes es similar al mío. Supongamos que el reloj es de 12 horas en lugar de 24.

Si son 24 horas, entonces esa es una historia diferente. Además, otra suposición, asuma si el reloj se detiene mientras calculamos esto.

Un ciclo de reloj es de 360 ​​grados.

  1. ¿Cuántos grados puede ejecutar el minutero por minuto? 360/60 = 6 grados por minuto.

  2. ¿Cuántos grados puede ejecutar la manecilla de la hora por hora? 360/12 = 30 grados por hora (ya que la mano de hora funcionar más lento que minutos)

Ya que es más fácil de calcular en la unidad, "minutos", vamos a llegar

"cuántos grados se la manecilla de la hora se ejecuta por minuto "?

30/60 = 0,5 grados por minuto.

Por lo tanto, si sabe cómo obtener esos números, el problema está más o menos solucionado.

8

Para encontrar el ángulo entre las agujas de un reloj es,

30 * [HRS - (MIN/5)] + (MIN/2) 
+0

Esto funciona muy bien. ¡¡Gracias por la respuesta!! –

+0

¿Falta valor absoluto? –

+0

Por favor, explique los valores 5 y 2. describir el cálculo de estos dos valores. de dónde vienen estos – vivek

2

Prueba este código:

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 "); 
    } 


} 

} 
-3

para encontrar el ángulo entre la aguja de las horas y el minutero es

angle=(hour*5-min)*6 
+0

¿Cuáles son los problemas con esta respuesta? – user6123723

1

Minuto ángulo (desde 12 en punto): 360 * Minuto/60

ángulo horas (de 12:00): 360 * (horas% 12)/12 + 360 * (minutos/60) * (1/12)

Ángulo entre hora y minuto: (ángulo horario - ángulo minuto)% 360 Por aritmética simple, esto reduce a 30 * horas - 5.5 * minutos.

-1

Esta es una solución (C#). Esta es una solución muy simple e ignora la precisión. Espero que la solución sea autoexplicativa.

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)); 
    } 
+0

Esta respuesta es incorrecta. A la 1:30, la manecilla de la hora está a medio camino entre 1 y 2 ... – Nemo

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; 
} 
} 
Cuestiones relacionadas