web-dev-qa-db-fra.com

Trouver l'angle entre les aiguilles des heures et des minutes dans une horloge analogique

On m'a donné cette question d'entrevue récemment:

Étant donné une horloge analogique de 12 heures, calculez en degrés le plus petit angle entre les aiguilles des heures et des minutes. Soyez aussi précis que possible.

Je me demande quel est l'algorithme le plus simple, le plus lisible et le plus précis. La solution dans n'importe quelle langue est la bienvenue (mais expliquez-la un peu si vous pensez qu'elle est nécessaire).

33

Il s'avère que Wikipedia a la meilleure réponse:

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

Fondamentalement:

  • L'aiguille des heures se déplace au rythme de 0.5 degrés par minute
  • L'aiguille des minutes se déplace au rythme de 6 degrés par minute

Problème résolu.


Et la précision n'est pas un problème car la partie fractionnaire est soit .0 ou .5, et de l'ordre de 0..360, toutes ces valeurs sont exactement représentables dans double.

42

Pour trouver l'angle entre les aiguilles d'une horloge est,

30 * [HRS - (MIN/5)] + (MIN/2) 
8
Suwaru Ram

Le code Java que les polygenlubrifiants sont similaires au mien. Supposons que l'horloge est de 12 heures au lieu de 24.

Si c'est 24 heures, c'est une autre histoire. En outre, une autre hypothèse, supposons que l'horloge s'arrête pendant que nous calculons cela.

Un cycle d'horloge est à 360 degrés.

  1. De combien de degrés la minute peut-elle tourner par minute? 360/60 = 6 degrés par minute.

  2. Combien de degrés l’aiguille des heures peut-elle fonctionner par heure? 360/12 = 30 degrés par heure (car l'aiguille des heures tourne plus lentement que la minute)

Puisqu'il est plus facile de calculer dans l'unité, "minute", passons

"combien de degrés l’aiguille des heures peut-elle fonctionner par minute"?

30/60 = 0,5 degré par minute.

Donc, si vous savez comment obtenir ces chiffres, le problème est à peu près résolu avec la solution.

5
Mikey
    **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;
}
}
1
Dileep kurahe

Angle des minutes (à partir de 12 heures): 360 * minutes/60

Angle horaire (à partir de 12 heures): 360 * (heure% 12)/12 + 360 * (minutes/60) * (1/12)

Angle entre heure et minute: (angle heure - angle minute)% 360 Par simple arithmétique, cela se réduit à 30 * heures - 5,5 * minutes.

1
Dhiraj Himani

Essayez ce code:

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


}

}
1
user2688705

Le problème est connu sous le nom de "Clock Angle Problem" où nous devons trouver l'angle entre les aiguilles (heure et minute) d'une horloge analogique à un moment particulier.

Solution en langage de programmation 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;
}

Compilez le programme ci-dessus dans votre système, j'ai utilisé Ubuntu 18.04 LTS Bionic Beaver , vous pouvez utiliser n'importe quel système sur lequel un compilateur C est installé.

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.

Remarques:
1. L'équation $\theta_{hr} = (30^\circ \times hour) + (0.5^\circ \times minute)$ vous donnera l'angle fait par l'aiguille des heures sur une horloge de 12 heures.
2. Si vous souhaitez calculer l'angle fait par l'aiguille des heures sur une horloge de 24 heures, utilisez l'équation suivante: $\theta_{hr} = (15^\circ \times hour) + (0.25^\circ \times minute)$
3. L'aiguille des secondes contribue également à la rotation de l'aiguille des minutes, mais nous l'avons ignorée car la contribution est insignifiante, c'est-à-dire 1/10 = 0,1.

0
Suraj Sharma