web-dev-qa-db-ja.com

アナログ時計で時針と分針の間の角度を見つける

私は最近このインタビューの質問を受けました:

12時間のアナログ時計を考えて、時針と分針の間の小さい角度を度数で計算します。できるだけ正確に。

私は、最も単純で、最も読みやすく、最も正確なアルゴリズムは何だろうと思っています。任意の言語のソリューションを歓迎します(ただし、必要だと思われる場合は少し説明してください)。

33

ウィキペディアには最良の答えがあります。

// 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で正確に表現できるため、精度は問題になりません。 。

42

時計の針の間の角度を見つけるには、

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

Java polygenlubricantが私のものと似ているコード。時計が24ではなく12時間であると仮定しましょう。

24時間なら、それは別の話です。また、別の仮定として、これを計算している間にクロックが停止したと仮定します。

1クロックサイクルは360度です。

  1. 分針は毎分何度まで動くことができますか? 360/60 = 1分あたり6度。

  2. 時針は1時間に何度まで動くことができますか? 360/12 = 1時間あたり30度(時針が1分より遅いため)

単位「分」で計算する方が簡単なので、取得しましょう

「毎分、時針は何度まで動くことができますか?」

30/60 = 0.5度/分。

したがって、これらの数値を取得する方法を知っていれば、問題はほとんど解決策で完了しています。

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

12時からの最小角度:360 *分/ 60

時間角(12時から):360 *(時間%12)/ 12 + 360 *(分/ 60)*(1/12)

時間と分の間の角度:(時間角-分角)%360単純な計算により、これは30 *時間-5.5 *分に減少します。

1
Dhiraj Himani

このコードを試してください:

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

この問題は 「クロック角度の問題」 として知られています。特定の時間にアナログ時計の針の間の角度(時間と分)を見つける必要があります。

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。方程式 - $\theta_{hr} = (30^\circ \times hour) + (0.5^\circ \times minute)$ は、12時間制の時針による角度を示します。
2。 24時間時計の時針による角度を計算する場合は、次の式を使用します。 $\theta_{hr} = (15^\circ \times hour) + (0.25^\circ \times minute)$
3。秒針も分針の回転に寄与しますが、その寄与は重要ではないため、つまり1/10 = 0.1なので無視しました。

0
Suraj Sharma