题目描述:
你有一个电子钟,可以显示 0:00
到 23:59
之间的所有时间,以数字的形式显示。其中小时是 0
到 23
(0 时会显示一个 0,而 1 到 9 时不会显示前导 0),分钟是 00
到 59
(0 到 9 分都会显示前导 0)。任何时刻,电子钟都会显示三个或者四个 00 到 99 的数字。如果在某时刻,这些数字依次组成了一个等差数列,则这个时刻被称为“好时刻”。
你感觉很无聊,从 0:00
时刻开始盯着这个电子钟。一共盯了 x 分钟。请问整个过程中,"好时刻"来临了多少次(算上开头和结尾)?
解题思路:
-----题解的思想是一个时刻是否是幸运时刻(即4个数是否组成等差数列),我们可以用一个大小为4的整形数组储存这4个数,然后判断他们之间的差值是否相等(注意小时有前导0的话不用计算差值)
-----由于输入样例x是一个整数,表示x分钟,所以可以用循环从0开始判断,一直到x,过程需要将分钟数转化为小时,方式如下:
要注意的一点,当时间来到23:59的时候下一分钟应该是00:00而不是24:00,也就是说时间从0到23:59之间进行循环,周期是1440分钟,所以在计算过程中得先对x/1440,求出循环周期(天数)有两种方式可以计算出幸运时刻数:
①先计算天数,然后计算一天中有多少个幸运时刻(注意是0到23:59),乘以天数之后,再计算0到x%1440之间的幸运时刻,两者相加即为答案。
②先计算天数,再计算0到x%1440之间的幸运时刻,如果天数为0,直接输出;若不为0,再计算x%1440到1440(不包括1440)之间的幸运时刻,就可以算出一天中有多少幸运时刻
-----通过计算我们可以得知一天有39个幸运时刻,但不建议直接使用,以下代码采取方法②计算幸运时刻数
代码模块:
#include<iostream>
using namespace std;
int t[4]; //全局数组变量,t[0]和t[1]表示小时,t[2]和t[3]表示分钟
//转换标准时间格式
void change(int num)
{
int hour = num / 60, minute = num % 60;
t[0] = hour / 10;
t[1] = hour % 10;
t[2] = minute / 10;
t[3] = minute % 10;
}
//判断是否为幸运时刻
bool is_lucky()
{
int dis1 = t[0] - t[1]; //注意有可能是前导0
int dis2 = t[1] - t[2];
int dis3 = t[2] - t[3];
//判断是否等差
if (dis2 == dis3 && (t[0] == 0 || dis1 == dis2))
return true;
return false;
}
int main()
{
int luck_num = 0; //幸运时刻数
int t = 0; //表示当前时间,从0开始,一直到x
int x; cin >> x;
int day = x / 1440; //计算天数
x %= 1440; //保证了x在一天之内
//计算0到x之间的幸运时刻
while (t <= x)
{
//改变时间
change(t);
//判断是否为幸运时刻
if (is_lucky() == true)
luck_num++;
t++;
}
if (day > 0)
{
//如果天数大于0,说明有循环,要计算每个循环(每一天)的幸运时刻数。
int day_luck = luck_num; //0~x有luck_num个幸运时刻,要计算x+1~1440的幸运时刻
while (t < 1440) //经过前面的while循环t已经是x+1了
{
//和之前的while几乎一样
change(t);
//判断是否为幸运时刻
if (is_lucky() == true)
day_luck++;
t++;
}
//计算总的幸运时刻数
luck_num += day_luck * day;
}
cout << luck_num << endl;
}
如果觉得本文有帮助到您,请点击下方一键三连,助力一下博主!