设为首页 加入收藏

TOP

时针分针与秒针(一)
2023-07-23 13:30:38 】 浏览:167
Tags:时针分

【例1】时针分针与秒针

问题描述

给定一个24小时格式的数字时间,问给定的这个时刻时针与分针、时针与秒针、分针与秒针 之间的夹角分别是多少?

输入

 有T(1≤T≤104)组测试用例。

 对于每组测试用例,用一行hh:mm:ss描述给定的时间。0≤hh<24,0≤mm<60,0≤ss<60。

 输出

 对于每组测试用例,输出像A/B这样的实数。(A和B是互质的)。如果它是一个整数,那么就直接输出它。描述时针和分针、时针和秒针、分针和秒针之间的角度。

输入样例 

4

00:00:00

06:00:00

12:54:55

04:40:00

输出样例

0 0 0

180 180 0

1391/24 1379/24 1/2

100 140 120

       (1)编程思路。

       将表盘的0点(或12点)作为起点,整个表盘转一圈360度,用60个刻度线分成60格,每1格就是6度。

       时钟每走1个小时,时针走5格,转30度;分针走60格,转360度(正好走一圈,相当转0度);秒针走3600格,转21600度(走了60圈,也相当转0度)。

       时钟每走1分钟,分针走1格,转6度;时针走5/60格,转1/2度;秒针走60格,相当转了0度。

       时钟每走1秒,秒针走1格,转6度;分针走1/60格,转1/10度;时针走5/3600格,相当转了1/120度。

       因此,对于任意一个时刻hh:mm:ss,有

       时针转的度数为 30*hh + 1/2*mm + 1/120*ss

       分针转的度数为 6*mm + 1/10*ss

       秒针转的度数为 6*ss

       计算出各指针转的度数后,它们之间的差值就是它们的夹角。

       由于计算时有分数比1/120,将它们都乘以120(相当于通分,分母为120),这样只看各分子部分。有

       时针转的度数为 3600*hh + 60*mm + ss

       分针转的度数为 720*mm + 12*ss

       秒针转的度数为 720*ss

       (2)源程序。

#include <stdio.h>
int gcd(int a,int b)
{
    if (a%b==0) return b;
    else return  gcd(b,a%b) ;
}
void output(int a,int b)   //  计算圆盘上转过a度和b度的两指针之间的夹角并输出
{
    int x;
    x=a>b? a-b:b-a ;
    if (x % 120 == 0)
    {
        x /= 120 ;
        x %= 360 ;
        if (x%360 == 0 )
            printf("0 ") ;
        else if (x%180 == 0 )
            printf("180 ") ;
        else
            printf("%d ", x<180?x:360-x) ;
    }
    else
    {
        x=x%43200;
        if (x>43200-x)    // 通分后,圆盘一周360度变成 43200度(360*120)
            x=43200-x;
        int k = gcd(x,120) ;
        printf("%d/%d ", x/k, 120/k) ;
    }
}
int main()
{
    int t;
    scanf("%d",&t);
    while (t--)
    {
        int h,m,s,x,y,z;
        scanf("%d:%d:%d", &h, &m, &s) ;
        x = 3600*h + 60*m + s ;
        y = 720*m + 12*s ;
        z = 720*s ;
        output(x,y);
        output(x,z);
        output(y,z);
        printf("\n") ;
    }
    return 0;
}

       将上面的源程序提交给HDU 题库 HDU 5387 Clock (http://acm.hdu.edu.cn/showproblem.php?pid=5387),可以Accepted。

       将上面的源程序略作修改,还可以提交给 HDU 2076 夹角有多大 (http://acm.hdu.edu.cn/showproblem.php?pid=2076)。

【例2】时针与分针的夹角

 问题描述

给定一个时间HH:MM:SS和一个参数a,请你计算满足以下条件的下一个时间:

1.时针和分针形成的角度是a。

2.时间可以不是整数,但向下舍入。例如12:34:56.78向下舍入为12:34:56。

 输入

输入包含多个测试用例。

每个测试用例包含两行。

第一行是时间HH:MM:SS(0≤HH<12,0≤MM<60,0≤SS<60)。

第二行包含一个整数a(0≤a≤180).

输出

对于每个测试用例,输出一行包含测试用例编号和答案HH:MM:SS。

输入样例

0:59:59

30

01:00:00

30

输出样例

Case #1: 01:00:00

Case #2: 01:10:54

       (1)编程思路。

       对给定的时间,一秒一秒的加1(向前走一秒到下一个时间)进行枚举,每次枚举一个时间,计算时针与分针的夹角r,若r正好等于a,输出当前时间并结束枚举。若r不是正好等于a,则输出找到的第1个形成夹角大于a的前一秒。为此,程序中用pr保存前1秒时间(ph:pm:ps)指针与分针的夹角,这样当前一秒的夹角pr小于a,但后一秒的夹角大于a,即pr!=a && (pr-a)*(r-a)<0时,输出前1秒时间ph:pm:ps即可。

       (2)源程序。

#include <stdio.h>
int main()
{
    int iCase=0;
    int h,m,s;
    while (scanf("%d:%d:%d",&h,&m,&s)!=EOF)
    {
        int a;
        scanf("%d", &a) ;
        int ph=h,pm=m,ps=s;
        double r,pr;
        pr=(3600*h + 60*m + s-720*m - 12*s+43200)%43200/120.0;
        if (pr > 180) pr=360-pr;
首页 上一页 1 2 3 4 下一页 尾页 1/4/4
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇TinyShell(CSAPP实验) 下一篇【C Primer PLus 摘录】第 10 章 ..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目