J'essaie de résoudre ce problème, mais je n'arrive toujours pas à comprendre la logique pour le résoudre.
hour degree = 360 / 12 = 30
minutes degree = 360 / 12 / 60 = 0.5
Donc, je pensais pouvoir formuler la fonction suivante en python:
def clockangles(hour, min):
return (hour * 30) + (min * 0.5)
Pour l'heure, cela fonctionne bien, car il semble y avoir un mappage 1 = 1. Mais pour la minute, il y a au moins un problème. Quand il est 0 minute, l'aiguille des minutes pointe à 12.
Par exemple:
19h: aiguilles indiquant 19h et minutes indiquant 12
Comment calculer les minutes correctement? S'il vous plaît, aidez-moi à comprendre la formule.
EDIT: Par exemple, si j'appelle la fonction ci-dessus à 19h, par exemple les horloges (7,0), je reçois la valeur 210. Toutefois, selon ce lien l'angle à 7:00 est 150
D'accord. Vous essayez de trouver l'angle entre les deux mains. Ensuite ceci:
minutes degree = 360 / 12 / 60 = 0.5
Est-ce juste le nombre de degrés de heure aiguille se déplace par minute. Pensez-y - l'aiguille des minutes parcourt 360 toutes les heures. Par conséquent, il n'y a que 60 minutes dans une révolution complète. 360/60 = 6 degrés par minute pour l'aiguille des minutes.
Donc, vous devez trouver la différence entre les aiguilles des heures et des minutes. Ainsi, la fonction ressemble maintenant à:
def clockangles(hour, minute):
return (hour * 30 + minute * 0.5) - (minute * 6)
Maintenant, ceci est valide, alors nous pourrions nous arrêter ici. Cependant, je devrais expliquer que cela peut donner à la fois des réponses supérieures à 180 degrés et des angles négatifs. Si vous ne voulez pas ces choses (et d'après vos commentaires, il semble que vous n'en ayez pas), corrigez-les.
def clockangles(hour, minute):
return abs((hour * 30 + minute * 0.5) - (minute * 6))
Maintenant, pas d'angles négatifs.
def clockangles(hour, minute):
ans = abs((hour * 30 + minute * 0.5) - (minute * 6))
return min(360-ans,ans)
Maintenant, le plus court des deux angles est formé en mesurant dans le sens horaire et antihoraire.
Ce n'est pas si difficile si vous y réfléchissez. Permet de considérer chaque main séparément. L'aiguille des minutes de l'horloge tourne à 360 degrés en 60 minutes, ainsi chaque minute représente 6 degrés. L'aiguille des heures de l'horloge tourne à 360 degrés en 12 heures. Nous savons donc qu'elle se déplace de 30 degrés au total toutes les heures, mais vous devez tenir compte de l'évolution de l'aiguille des heures entre les heures. c'est-à-dire qu'à 3h30 l'aiguille des minutes est sur 6 et que l'aiguille des heures a dépassé 3. Nous pouvons calculer cet avancement simplement par (minutes/60) * 30 degrés, ce qui équivaut à minutes/2. Donc, une fois que nous connaissons les degrés de chaque main, nous trouvons simplement la différence. Et la formule sera comme
degrees = Math.Abs(((hour*30.0 + minute/2.0) - minute*6.0) % 360)
Multipliez les heures par 60 qui le convertissent en minutes. heures * 60 = minutes
Ajoutez maintenant les minutes données et les minutes converties.
minutes données + minutes converties = minutes totales
Divisez maintenant le nombre total de minutes par 2, c'est-à-dire pour trouver sa moyenne. total de minutes/2
Maintenant, multipliez les minutes données par 6. Les minutes données * 6
Soustrayez maintenant le point 3 du point 4.
Par cette méthode, vous obtiendrez une réponse précise.
Dans la solution suivante, la variable m fait référence aux minutes et la variable h aux heures.
Séparons le problème en ses composants.
Maintenant, commençons à résoudre chaque composant.
(m / 60)
. Puisqu'il y a 360 degrés, nous pouvons obtenir l'angle de l'aiguille des minutes à partir de 12 heures par (m / 60) * 360
. L'aiguille des heures fait un cycle complet toutes les 12 heures. Comme il y a 24 heures dans une journée, nous devons normaliser la valeur de l'heure à 12 heures. Ceci est accompli par (h % 12)
, qui renvoie le reste de la valeur de l'heure divisé par 12.
Maintenant, alors que l'aiguille des minutes effectue son cycle, l'aiguille des heures ne reste pas simplement à la valeur exacte de (h % 12)
. En fait, il se déplace de 30 degrés entre (h % 12)
et (h % 12) + 1
. Le montant par lequel l'aiguille des heures s'écarte de (h % 12)
peut être calculé en ajoutant à (h % 12)
le pourcentage terminé du cycle de l'aiguille des minutes, qui est (m / 60)
. Globalement, cela nous donne (h % 12) + (m / 60)
.
Maintenant que nous avons la position exacte de l’aiguille des heures, nous devons obtenir le pourcentage achevé du cycle de l’aiguille des heures, que nous pouvons obtenir par ((h % 12) + (m / 60)) / 12
. Comme il y a 360 degrés, nous pouvons obtenir l'angle de l'aiguille des heures à partir de 12 heures avec (((h % 12) + (m / 60)) / 12) * 360
.
Maintenant que nous avons l'angle de l'aiguille des minutes et des heures à partir de 12 heures, il suffit de trouver la différence entre les deux valeurs et de prendre la valeur absolue (car la différence peut être négative).
Donc dans l’ensemble, nous avons abs(((((h % 12) + (m / 60)) / 12) - (m / 60)) * 360)
.
Ci-dessous, une fonction python qui calcule cette valeur. La valeur de l'angle le plus court sera renvoyée.
def find_angle(h, m):
if abs(((((m/60)+(h%12))/12)-(m/60))*360) > 180:
return 360 - abs(((((h % 12) + (m / 60)) / 12) - (m / 60)) * 360)
return abs(((((h % 12) + (m / 60)) / 12) - (m / 60)) * 360)
Utilisez l'algorithme:
1.Angle minimal = 360 * minutes/60
2.Angle heure = [360 * (heure% 12)/12] + [360 * (minutes/60) * (1/12)]
3.Angle heure/minute = (angle heure - angle minute)% 360
this réduit à 30 * heures - 5,5 * minutes .
h = int(input())
m = int(input())
angle = float(abs(11 /2 * m - 30 * h))
print(" {}:{} makes the following angle {}°".format(h, m, angle))
Remarque :
60min = 360deg
1min = 6deg
Par exemple: - considérons le temps comme 2:20 (soit 2h20)
abs ((2h * 5) min - (20) min) = 10 min
angle_1 = 10min x 6deg = 60deg
angle_2 = 360deg - 60deg = 300deg (signifie l'angle de l'autre côté)
Donc, hors des deux angles, angle_1 est petit.
donc, min_angle = 60deg
def min_angle_bet_hr_min(hr, min):
angle_1 = (hr*5 - min)*6
angle_2 = 360 - angle_1
if angle_1 < angle_2:
min_angle = angle_1
Elif angle_1 > angle_2:
min_angle = angle_2
else:
min_angle = 0
return abs(min_angle)
J'ai travaillé sur ce problème et créé une équation:
(hr*30)+(min/2)-(min*6)
ou
(min*6)-(hr*30)-(min/2)