TRZ_2007 的博客

TRZ_2007 的博客

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

posted on 2019-06-28 13:47:24 | under 题解 |

Remarks

这题居然有100+数据!%%%

Solution

这题目看着简单,其实做起来还是很麻烦的,不知道是不是我想复杂了,因为这题首先要依次枚举每个日期,输出还要带补全,最重要的是,还要判断闰年!
让我们把这题分解开来讲:

  • 1:判断是否为整除日:

这个应该还是挺好判断的,只需要判断年是否能被月乘日给整除即可。由于后面还需要判断,所以我们写个函数。

bool Judge(int a,int b,int c)
{
    return !(a%(b*c));
}
  • 2:枚举年月日:

这个有点麻烦,因为我们需要做好多的进位(日->月,月->年),所以我们也需要好多的特判。

  • 3:补全:

这个可能会有一些简单的方法,但是位数较小,暴力即可。

接下来就是代码的实现了。

$code$

#include <bits/stdc++.h>
using namespace std;

int year,month,day;
int flag;

bool Judge(int a,int b,int c)
{
    return !(a%(b*c));
}

int main()
{
    scanf("%d/%d/%d",&year,&month,&day);
    if(Judge(year,month,day))
    {
        if(year<1000)//暴力补全
        {
            if(year<10) cout<<"000";
            else if(year<100) cout<<"00";
            else cout<<"0";
        }
        cout<<year<<"/";
        if(month<10) cout<<"0";
        cout<<month<<"/";
        if(day<10) cout<<"0";
        cout<<day<<"\n";
        return 0;
    }
    while(1)//枚举最近的整除日
    {//处理进位
        if((year%4==0)&&(year%100!=0)||(year%400==0)) flag = 1;
        day++;
        if(!flag&&month==2&&day>28) month++,day = 1;
        else if((month<=6)&&(month%2)&&(day>31)) month++,day = 1;
        else if((month<=6)&&!(month%2)&&(day>30)) month++,day = 1;
        else if((month>6)&&(month!=7)&&(month%2)&&(day>30)) month++,day = 1;
        else if((month>6)&&(!(month%2)||(month==7))&&(day>31)) month++,day = 1;
        else if((flag)&&(month==2)&&(day>29)) month++,day = 1;
        if(month>12) year++,month = 1;
        if(Judge(year,month,day))//补全
        {
            if(year<1000)
            {
                if(year<10) cout<<"000";
                else if(year<100) cout<<"00";
                else cout<<"0";
            }
            cout<<year<<"/";
            if(month<10) cout<<"0";
            cout<<month<<"/";
            if(day<10) cout<<"0";
            cout<<day<<"\n";
            return 0;
        }
    }
}