计算时钟的夹角

写在前面:

题解是对具体题目的编程实现,不会具体讲解C语言语法。请先大致学习好语法,自己敲敲代码后再看题解(上来就直接看题解的习惯不好哟~)。在每一题的题解之前,会列出本题涉及到的语法知识供参考,可以在教材或其他学习资源找到这些内容学习。😀


本题的预备知识:

  • 变量的定义与赋值操作
  • 输入(scanf)输出(printf)语句 ,特别是输出格式的控制
  • 条件语句(if)
  • 运算符:/、*

计算时钟的夹角

成绩5开启时间2020年03月14日 星期六 08:00
折扣0.8折扣时间2020年04月28日 星期二 23:55
允许迟交关闭时间2020年04月30日 星期四 23:55

背景:

钟面上的时针和分针之间的夹角总是在 0 ~180之间 ( 包括 0 和180 ) 。举例来说,在十二点的时候两针之间的夹角为 0 ,而在六点的时候夹角为180 ,在三点的时候为90 。本题要解决的是计算 12:00 到 11:59 之间任意一个时间的夹角。

输入:

每组测试数据包含两个数字:第一个数字代表小时 ( 大于 0 小于等于 12) ,第二个数字代表分 ( 在区间 [0, 59] 上 ) 。

输出:

对应每组测试数据,用常用格式显示时间以及这个时候时针和分针间的最小夹角,精确到小数点后一位。输出格式如下所示。

再看一看,想一想:是否可以不用if 语句,只使用 printf 函数来简化你的程序?

 测试输入期待的输出时间限制内存限制额外进程
测试用例 1 
  1. 12 0↵
 
  1. At 12:00 the angle is 0.0 degrees.↵
1秒64M0
测试用例 2 
  1. 12 30↵
 
  1. At 12:30 the angle is 165.0 degrees.↵
1秒64M0
测试用例 3 
  1. 6 0↵
 
  1. At 6:00 the angle is 180.0 degrees.↵
1秒64M0
测试用例 4 
  1. 3 0↵
 
  1. At 3:00 the angle is 90.0 degrees.↵
1秒64M0
测试用例 5 
  1. 3 3↵
 
  1. At 3:03 the angle is 73.5 degrees.↵
1秒64M0
测试用例 6 
  1. 3 9↵
 
  1. At 3:09 the angle is 40.5 degrees.↵
1秒64M0
测试用例 7 
  1. 4 0↵
 
  1. At 4:00 the angle is 120.0 degrees.↵
1秒64M0
测试用例 8 
  1. 5 59↵
 
  1. At 5:59 the angle is 174.5 degrees.↵
1秒64M0
测试用例 9 
  1. 4 20↵
 
  1. At 4:20 the angle is 10.0 degrees.↵
1秒64M0
测试用例 10 
  1. 0 0↵
 
  1. At 0:00 the angle is 0.0 degrees.↵
1秒64M0

题解

大体思路:我们将时钟面板上分为60步,分别计算出时钟、分钟精确指向的步数(可能会出现小数)然后做差(要取绝对值)。这个差值就是步数之差,根据其在60步中所占的百分比来✖360度,即可。

#include <stdio.h>  //导入stdio.h库,里面包含输入输出函数
#include <math.h>   //导入stdio.h库,里面包含fabs()函数 ———— 取绝对值

int main() {
    int h, m;  //定义两个整型变量,分别用于存储小时、分钟
    scanf("%d %d", &h, &m);   //将输入的两个整数分别存入变量h、m中

    double h_step = (h % 12 + m / 60.0) * 5;   //定义一个双精度浮点数,存储小时对应的步数
    double m_step = m;   //定义一个双精度浮点数,存储分钟对应的步数

    double between_step = fabs(m_step - h_step);  //定义一个双精度浮点数,存储分钟与小时的步数差(取绝对值,这里使用了fabs函数)
    double between_angle = 360 * (between_step / 60);  //定义一个双精度浮点数,存储分钟与小时的夹角

    if (between_angle > 180)
        between_angle -= 180;   //保证答案不为钝角
    /* 输出结果
     * 注意: 分钟的输出一定是两位,不足要在前补0 所以格式为%02d
     *        角度的输出是保留一位小数 所以格式为%.1f */
    printf("At %d:%02d the angle is %.1f degrees.\n", h, m, between_angle);
}

🔺注意: double h_step = (h % 12 + m / 60.0) * 5

这条语句中,h%12是为了当输入的时为12时,我们需要置零。m / 60.0,这里一定不能写成60,除法运算符 '\',如果两边的数字都是整数的话,默认结果只会取整数部分,而我们的m是整型的,必须写浮点数60.0,让计算机将结果保存为浮点数。

 


易错点

  1. 根据题目输出的要求,分钟的输出一定是两位数且不足的时候要用0补齐,最后要加上换行符,即\n。
  2. 本题引用了一个函数来方便我们的代码,fabs。要使用它必须再最开始导入(include)math.h库。

有任何问题欢迎评论交流,如果本文对您有帮助不妨点点赞,嘻嘻~ 



欢迎关注个人公众号“ 鸡翅编程 ”,这里是认真且乖巧的码农一枚。

---- 做最乖巧的博客er,做最扎实的程序员 ----

旨在用心写好每一篇文章,平常会把笔记汇总成推送更新~

在这里插入图片描述

 

  • 7
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值