时钟夹角(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;
}
posted @   xuchaoxin1375  阅读(18)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
点击右上角即可分享
微信分享提示