时钟夹角(C语言四舍五入与向下取整的应用)

时钟夹角
题目描述
fire现在没有事情做,只能看着时钟发呆,出于对数据的渴望,

突然他想知道这个表的时针和分针的夹角是多少?

现在fire知道的只有时间,请你帮他算出这个夹角。

注:夹角的范围[0180],时针和分针的转动是连续而不是离散的。
输入
输入数据的第一-行是一-个数据T,表示有T组数据。每组数据有三个整数 h(0<= h<24),m(0<= m< 60),
s(0<=s< 60)分别表示时、分、秒。
输出
对于每组输入数据,输出夹角的大小的    整数部分。
样例输入
2
8 3 17 
5 13 30

样例输出
138
75

!分析:
思路:将当前时刻单位统一为分钟(小时数部分可不考虑);再将当前时刻统一单位为小时(分钟和秒钟都化作小时为单位);

事实上,其实如果肉眼足够强大的化,分针和秒针是不必要看的
(时针是能够反赢分钟和秒针的位置的,时针外的两个指针是为了弥补肉眼的不足)
同样的对于分针来讲,秒针也只是帮助人眼观察,(分钟本身是可以反映秒针的位置呢)

我们不妨先考虑秒针为零的基准状况:
另外,
写个函数,
秒针相对于12/0点刻度的偏转量;


写个函数计算分针对12/0点的偏转角度
最后求时针对12点的偏转量.
再将后两者做差.

秒针转动一格:即秒针偏转6°(时间推进了一秒钟,== 1/60分钟 == 1/3600小时)
那么这时候,分针将偏转:6°*(1/60);
时针将偏转6°*(1/3600);

分钟转动一格,时钟偏转6°*(1/60)
(总之,上一级的偏转量要基于(且仅基于)下一级别指针的偏转量)
 
基于上,可以算出
 */

#include <stdio.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>
#define ANGLE_PER_MINUTE 6
#define ANGLE_PER_HOUR 30
// // 拷贝到平台的时候把my_fuction_lib.h注释掉.
//#include "my_fuction_lib.h"

//在此下方插入自定义函数对的声明:
/* 返回分针偏转角度. */
float minute_hand_angle(int minute,int second)
{
    float minute_offset = 0;
    minute_offset += ANGLE_PER_MINUTE * ( minute + second  / 60.0);//be careful.
    return minute_offset;/* 返回分针偏转角度. */
}
/*tips莫把分钟数和分针偏转角搞混了. */
float hour_hand_angle(int hour,int minute,int second)
{
    float hour_offset = 0;
    /* 先将秒钟数整合到分钟数,将分钟数整合到小时(单位转换),最后乘以每小时的偏转角. */
    hour_offset += ANGLE_PER_HOUR * ( hour + (minute + second / 60.0 )  / 60.0 );
    return hour_offset;/*返回时针偏转角度*/
}
//主函数main
int main()
{
    //复制模版式删除这个或者再下面一个
    int n;
    struct time{
        int hour;
        int minute;
        int second;
    }time_in_day;
    struct time *p;
    p = &time_in_day;
    while (scanf("%d", &n) != EOF)
    {
        for(int i = 0;i<n;i++)
        {
            scanf("%d %d %d", &(p->hour), &(p->minute), &(p->second));
            if(p->hour >= 12) p->hour -= 12;/*处理24小时制的时间*/
            

            float angle_minute = 0, angle_hour = 0;
            angle_minute = minute_hand_angle((p->minute), (p->second))            angle_hour = hour_hand_angle( p->hour, p->minute,p->second);

            /* -0.5是为了向下取整(否则系统将四舍五入.) */

            //取出一个浮点数的小数部分
            float result = fabs(angle_minute - angle_hour);

            if (result <= 180 && result > 0.4)
            {
                printf("%.0f\n", result - 0.5);
            }
            else if (result <= 0.4)
            {
                printf("%.0f\n", result );
            }
            
            else
            {
                printf("%.0f\n", 360 - result - 0.5);
            }
        }
    }

    return 0;
} 

版本2:

#define _CRT_SECURE_NO_WARNINGS
//
//时钟夹角
//题目描述
//fire现在没有事情做,只能看着时钟发呆,出于对数据的渴望,
//
//突然他想知道这个表的时针和分针的夹角是多少?
//
//现在fire知道的只有时间,请你帮他算出这个夹角。
//
//注:夹角的范围[0,180],时针和分针的转动是连续而不是离散的。
//输入
//输入数据的第一 - 行是一 - 个数据T,表示有T组数据。每组数据有三个整数 h(0 <= h < 24),m(0 <= m < 60),
//    s(0 <= s < 60)分别表示时、分、秒。
//    输出
//    对于每组输入数据,输出夹角的大小的    整数部分。
//    样例输入
//    2
//    8 3 17
//    5 13 30
//
//    样例输出
//    138
//    75
//
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>
#define ANGLE_PER_MINUTE 6
#define ANGLE_PER_HOUR 30
// // 拷贝到平台的时候把my_fuction_lib.h注释掉.
//#include "my_fuction_lib.h"

//在此下方插入自定义函数对的声明:
/* 返回分针偏转角度. */
float minute_hand_angle(int minute, int second)
{
    float minute_offset = 0;
    minute_offset += ANGLE_PER_MINUTE * (minute + second / 60.0);//be careful.
    return minute_offset;/* 返回分针偏转角度. */
}
/*tips莫把分钟数和分针偏转角搞混了. */
float hour_hand_angle(int hour, int minute, int second)
{
    float hour_offset = 0;
    /* 先将秒钟数整合到分钟数,将分钟数整合到小时(单位转换),最后乘以每小时的偏转角. */
    hour_offset += ANGLE_PER_HOUR * (hour + (minute + second / 60.0) / 60.0);
    return hour_offset;/*返回时针偏转角度*/
}
//主函数main
int main()
{
    //复制模版式删除这个或者再下面一个
    int n;
    struct time {
        int hour;
        int minute;
        int second;
    }time_in_day;
    struct time* p;
    p = &time_in_day;
    /*输入测试数据的组数:*/
    while (scanf("%d", &n) != EOF)
    {
        for (int i = 0; i < n; i++)
        {
            /*输入的分钟<60;秒钟<60;*/
            scanf("%d %d %d", &(p->hour), &(p->minute), &(p->second));
            if (p->hour >= 12) p->hour -= 12;/*处理24小时制的时间*/


            float angle_minute = 0, angle_hour = 0;
            angle_minute = minute_hand_angle((p->minute), (p->second));
            angle_hour = hour_hand_angle(p->hour, p->minute, p->second);

            /* -0.5是为了向下取整(否则系统将四舍五入.) */

            //取出一个浮点数的小数部分
            float result = fabs(angle_minute - angle_hour);

            //if (result <= 180 && result > 0.4)
            //{
            //    printf("%.0f\n", result - 0.5);
            //}
            //else if (result <= 0.4)
            //{
            //    printf("%.0f\n", result);
            //}
            if (result <= 180 )
            {
                /*针对result = 0时,0-0.5 = -0.5,四舍五入变成-1了.*/
                if(result>0)
                    printf("%.0f\n", result - 0.5);
                else
                    printf("0\n");
                /*或者:
                if (!result)
                {
                    printf("0\n");
                }
                printf("%.0f\n", result - 0.5);*/
            }
            else
            {
                printf("%.0f\n", (360 - result) - 0.5);/*如果360-result为1,2,3,4,..,180
                                                       -0.5再四舍五入,不发生改变.;如果是1+k,2+k,3+k,..179+k (k是0<k<1的纯小数;k-0.5后四舍五入后一定为0);综上两种情况,任意一个正数m数-0.5再四舍五入,可以达到取整的效果.;实际上,如果对象包括实数集R时,m-0.5再四舍五入就时向下取整了!*/
            }
        }
    }

    return 0;
}

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值