题解 AT54 【割り切れる日付】

· · 题解

水题

但是被卡了很久

提要

找出离输入时间最近的整除日。一天一天枚举就行了。另外还要判断新月和新年。

已有的四篇题解都是用for来循环,外加月份输出特判;其实没必要那么深奥:

创新之处

1.使用while循环,专为喜爱暴力枚举的你打造。

2.全新输出方法,再也不用为特判烦恼啦!

cout<<y<<'/'<<m/10<<m%10<<'/'<<d/10<<d%10<<endl;

我们以1000年10月1日为例:

输出y:1000

输出/:1000/

输出m/10,10/10=1:1000/1

输出m%10,10%10=0:1000/10

输出/:1000/10/

输出d/10,1/10=0:1000/10/0

输出d%10,1%10=1:1000/10/01

代码

#include<bits/stdc++.h>
using namespace std;
int y,m,d,t;
int a[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};//前面没开数组结果被整到怀疑人生,在此提醒各位,数组还是要开的。
char ch;
bool leap(int year)//闰年
{
    return (!(year%4)&&year%100||!(year%400));
}
int main()
{
    cin>>y>>ch>>m>>ch>>d;
    if (leap(y))
      a[2]++;
    while (y%(d*m))//如果不是整除日,就继续枚举
    {
        ++d;
        if (d>a[m])
        {
            m++;
            d=1;
        }
        if (m>12)
        {
            ++y;
            m=1;
        }   
    }
    cout<<y<<'/'<<m/10<<m%10<<'/'<<d/10<<d%10<<endl;//输出别忘换行
    return 0;
}

熬了三天才AC啊,体谅一下我的辛苦吧!