题目:(钟表)
题目描述(13届 C&C++ B组B题)
解题思路:
-
理解钟表指针的运动:
-
秒针每分钟转一圈,即每秒转6度。
-
分针每小时转一圈,即每分钟转6度。
-
时针每12小时转一圈,即每分钟转0.5度。
-
-
计算角度:
-
秒针的角度 S=6m(其中 m 是秒)。
-
分针的角度 M=6f+0.1m(其中 f 是分)。
-
时针的角度 H=30s+0.5f+0.0083m(其中 s 是小时)。
-
-
计算夹角:
-
分针和时针的夹角 A=∣H−M∣。
-
分针和秒针的夹角 B=∣M−S∣。
-
-
条件判断:
- 需要满足 A=2B。
-
遍历时间:
- 从 s=0 到 s=6,ff 从 0 到 59,mm 从 0 到 59,检查每个时间点是否满足条件。
代码实现(C语言):
cs
#include <stdio.h>
#include <stdlib.h>
int main()
{
int h = 0, m = 0, s = 0; // 时、分、秒
double A, B, H, M, S; // A、B 表示题目中的夹角,H、M、S 表示时针、分针、秒针的度数
while (h < 6) // 时针只需遍历 0~6
{
s++; // 秒针每秒加一
if (s == 60) // 秒针转一圈
{
s = 0;
m++;
}
if (m == 60) // 分针转一圈
{
m = 0;
h++;
}
// 计算秒针、分针、时针当前的位置(以度数为单位)
S = s * 6.0; // 秒针每秒走6度
M = (m + s / 60.0) * 6.0; // 分针每分钟走6度,并加上秒针带来的细微变化
H = (h + m / 60.0 + s / 3600.0) * 30.0; // 时针每小时走30度,并加上分针和秒针带来的变化
// 计算时针与分针的夹角 A
A = (H > M) ? (H - M) : (M - H);
if (A > 180) A = 360 - A; // 确保 A 在 [0, 180] 范围内
// 计算分针与秒针的夹角 B
B = (S > M) ? (S - M) : (M - S);
if (B > 180) B = 360 - B; // 确保 B 在 [0, 180] 范围内
// 判断是否满足 A = 2B
if (A == 2 * B)
{
// 找到答案后直接跳出循环
break;
}
}
// 输出时、分、秒
printf("%d %d %d\n", h, m, s);
return 0;
}
得到运行结果:
代码分析:
变量说明
-
h, m, s:分别表示小时、分钟、秒的整数值。
-
H, M, S:分别表示时针、分针、秒针所指向的具体角度(度数)。
-
A, B:分别表示时针与分针的夹角、分针与秒针的夹角。
角度计算
-
秒针的角度 :。秒针每秒钟走 6 度。
-
分针的角度 :。分针每分钟走 6 度,且秒针的细微变化会影响分针的位置。
-
时针的角度 :。时针每小时走 30 度,同时分针和秒针也会微调时针的位置。
夹角计算
-
两个指针的夹角:是大角减小角,如果夹角大于 180 度,取补角。
-
时针与分针夹角 A :
-
分针与秒针夹角 B :
判断条件
- 只需判断是否满足 ( A = 2B )。
循环终止
- 当找到符合条件的时、分、秒时,用
break
终止循环,输出结果即可。
难度分析
⭐️⭐️⭐️
总结
这段代码通过模拟时钟的运行,计算出在一天中的某个时刻,时针和分针的夹角是分针和秒针夹角的两倍。这个问题考察了对时间的理解和指针运动的计算,以及如何将这些计算转化为代码实现。