2010-05-01 8 views
33

ich dieses Interview Frage vor kurzem gegeben wurde:Finden Winkel zwischen Stunden- und Minutenzeiger in einer Analoguhr

eine 12-Stunden-analoge Uhr gegeben, berechnen den kleineren Winkel zwischen der Stunden- und Minutenzeigern in Graden. Sei so präzise wie du kannst.

Ich frage mich, was ist der einfachste, lesbarste, genaueste Algorithmus ist. Lösung in jeder Sprache ist willkommen (aber erklären Sie es ein wenig, wenn Sie denken, dass es notwendig ist).

+9

einfachsten? Nachschlagen auf Wiki! : http://en.wikipedia.org/wiki/Clock_angle_problem ' –

+4

Ich denke, dass dies ein rein mathematisches Problem und auch ziemlich trivial ist. Ich sehe nicht, wie diese Frage vier Up-Stimmen bekommen kann ... –

Antwort

41

Es stellt sich heraus, dass Wikipedia die beste Antwort hat:

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

Grundsätzlich gilt:

  • Der Stundenzeiger bewegt sich mit einer Geschwindigkeit von 0.5 Grad pro Minute
  • Die Minute Hand bewegt sich mit der Geschwindigkeit von 6 Grad pro Minute

Problem gelöst.


und Präzision ist kein Problem, da der Bruchteil entweder .0 oder .5, und im Bereich von 0..360, alle diese Werte sind genau darstellbare in double ist.

+1

Das ist nicht richtig für h> = 12. – starblue

+1

@Starblue: Ich habe geklärt, dass es eine 12-Stunden-Analoguhr ist. – polygenelubricants

+17

@starblue Kann analoge Uhr jemals 24hr sein? – AksharRoop

-3

Ich weiß nicht, ob es richtig ist, etwas so?

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

Nun kann es nicht richtig sein, wenn du eine Endklammer vermisst: D – Ponkadoodle

+0

Für 'h = 3',' m = 0', bekomme ich '45'. Es sollte "90" sein. – polygenelubricants

+0

@poly okay, ich habe vergessen, normale Uhr ist 12, nicht 24 Stunden. Wenn Sie Division durch 24 mit 12 ersetzen, sollten Sie richtig – Anycorn

4

Der Java-Code, der polygenlubricants ist ähnlich wie meins. Nehmen wir an, dass die Uhr 12 statt 24 Stunden ist.

Wenn es 24 Stunden ist, dann ist das eine andere Geschichte. Nehmen Sie noch eine weitere Annahme an, wenn die Uhr gestoppt wird, während wir dies berechnen.

Ein Taktzyklus ist 360 Grad.

  1. Wie viel Grad kann der Minutenzeiger pro Minute laufen? 360/60 = 6 Grad pro Minute.

  2. Wie viel Grad kann der Stundenzeiger pro Stunde laufen? 360/12 = 30 Grad pro Stunde (seit Stundenzeiger langsamer als Minuten laufen)

Da es einfacher ist, in der Einheit zu berechnen, „Minute“, lassen Sie uns

„, wie viele Grad bekommen der Stundenzeiger pro Minute "?

30/60 = 0,5 Grad pro Minute.

Also, wenn Sie wissen, wie man diese Zahlen bekommen, ist das Problem ziemlich viel mit Lösung gemacht.

8

Für den Winkel zwischen dem Zeiger einer Uhr zu finden ist,

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

Das funktioniert super. Danke für die Antwort!! –

+0

Fehlender absoluter Wert? –

+0

Bitte erläutern Sie 5 und 2 Werte. beschreiben die Berechnung dieser beiden Werte. woher diese kommen. – vivek

2

diesen Code Versuchen:

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

für den Winkel zwischen den Stundenzeigern zu finden und dem Minutenzeiger ist

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

Was sind die Probleme mit dieser Antwort? – user6123723

1

Minute Winkel (von 12 Uhr): 360 * Min/60

Stunden-Winkel (von 12 Uhr): 360 * (h% 12)/12 + 360 * (Minuten/60) * (1/12)

Winkel zwischen Stunde und Minute: (Stundenwinkel - Minutenwinkel)% 360 Durch einfache Arithmetik reduziert sich dies auf 30 * Stunden - 5,5 * Minuten.

-1

Dies ist eine Lösung (C#). Dies ist eine sehr einfache Lösung und ignoriert Präzision. Hoffe, die Lösung ist selbsterklärend.

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

Diese Antwort ist falsch. Um 1:30 Uhr ist der Stundenzeiger zwischen 1 und 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; 
} 
}