题解:B4191 [海淀区小学组 2023] 回文时间

· · 题解

先警示一下后人:注意输入!这一点被卡了很久

思路

首先先分析这道题,让我们输出给定时间的下一个回文时间,那么就考虑暴力枚举,因为数据量很小。

解法

我们考虑进行枚举,搞一个循环,让分钟每次都加 1,如果分钟数到达了 60,就把分钟数归零,同时小时数加一。

注意这到题目的时间是循环的,即小时数如果超过了 23 也要归零。最后每次都检查一下,是否为回文时间。如果找到了答案就输出结果并跳出循环。

因为回文时间就是小时数的十位与分钟数的个位相等,小时数的个位与分钟数的十位相等,就可以用 C++ 的整除来处理十位,取模运算处理个位。

输入与输出

强调一下:注意输入,注意输入,注意输入!输入里有个冒号! 我们可以用scanf来输入这个冒号,或者使用一个char来输入都是可以的。

输出这里可能需要补零,如果使用if来进行判断会使代码量增加许多,这就导致我懒得写而换一道题目做,那怎么办呢?我们可以用万能的printf,占位符使用%0nd就可以使输出不足 n 位的就往前面补零,这样就很好的解决了这个问题。

代码

没什么好说的,看注释。

#include<bits/stdc++.h>    //万能头 
using namespace std;
int h,m;    //用来输入小时和分钟 
bool check(int h,int m){    //check函数用来检查当前时间是否为回文时间 
    if(h/10==m%10&&h%10==m/10) return 1;
    else return 0;
}
int main(){
    scanf("%d:%d",&h,&m);    //在%d占位符中间加上:可以避免读入的时候把冒号读到数字里 
    while(1){    //开始枚举 
        m++;    //分钟加1 
        if(m==60) m=0,h++;    //判断分钟数是否超过60,增加小时数 
        if(h==24) h=0;    //判断小时数是否超过24 
        if(check(h,m)){    //检查是否满足要求 
            printf("%02d:%02d",h,m);    //如果是,就输出答案 
            break;    //然后跳出循环 
        }
    }
    return 0;    //好习惯,在考场时千万不能不写,防止出现意外 
}