Подтвердить что ты не робот

Найти угол между часами и минутами в аналоговых часах

Мне недавно дали этот вопрос:

Учитывая 12-часовые аналоговые часы, вычислите в градусе меньший угол между часовым и минутным стрелками. Будьте как можно точнее.

Мне интересно, какой самый простой, наиболее читаемый, самый точный алгоритм. Решение на любом языке приветствуется (но немного объясните, если вы считаете это необходимым).

4b9b3361

Ответ 1

Получается, что у Википедии есть лучший ответ:

// 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 все эти значения точно представлены в double.

Ответ 2

Для нахождения угла между часами часов,

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

Ответ 3

Код Java, который является полигенными смазочными материалами, похож на мой. Предположим, что часы составляют 12 часов вместо 24.

Если это 24 часа, то это другая история. Кроме того, другое предположение, предположим, что часы остановлены, пока мы вычислим это.

Один такт составляет 360 градусов.

  • Сколько минут может выполнять минутная стрелка в минуту? 360/60 = 6 градусов в минуту.

  • Сколько часов может пройти час в час? 360/12 = 30 градусов в час (так как часовая стрелка работает медленнее минуты)

Так как проще вычислить в блоке "минута", давайте получим

"сколько градусов может выполнять часовая стрелка в минуту"?

30/60 = 0,5 градуса в минуту.

Итак, если вы знаете, как получить эти числа, проблема в значительной степени решена с помощью решения.

Ответ 4

Попробуйте этот код:

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


}

}

Ответ 5

Минимальный угол (от 12 часов): 360 * минут /60

Угол часа (от 12 часов): 360 * (час% 12)/12 + 360 * (минут/60) * (1/12)

Угол между часами и минутами: (часовой угол - минутный угол)% 360 По простой арифметике это сокращается до 30 * часов - 5,5 * минут.

Ответ 6

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

Ответ 7

Эта проблема известна как "Проблема угла часов", где нам нужно найти angular между стрелками (часы и минуты) аналоговых часов в определенное время.

Решение на языке программирования Си.

#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, вы можете использовать любую систему, в которой установлен компилятор Си.

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. Уравнение $\theta_{hr} = (30^\circ \times hour) + (0.5^\circ \times minute)$ даст вам angular, полученный часовой стрелкой на 12-часовых часах.
 2. Если вы хотите вычислить angular наклона часовой стрелки на 24-часовых часах, используйте следующее уравнение: $\theta_{hr} = (15^\circ \times hour) + (0.25^\circ \times minute)$
 3. Секундная стрелка также способствует вращению минутной стрелки, но мы проигнорировали ее, потому что вклад незначителен, то есть 1/10 = 0,1.

Ответ 8

Это одно решение (С#). Это очень простое решение и игнорирует точность. Надеюсь, что решение самоочевидно.

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

Ответ 9

Я не знаю, правильно ли это. Что-то вроде этого?

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

Ответ 10

для нахождения угла между часовой стрелкой и минутной стрелкой

angle=(hour*5-min)*6