T292112 [传智杯 #5 练习赛] 时钟

题目描述:

你有一个电子钟,可以显示 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;
}

如果觉得本文有帮助到您,请点击下方一键三连,助力一下博主!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值