30分求指导

P2010 [NOIP2016 普及组] 回文日期

strike @ 2017-10-04 12:06:35

#include<iostream>
#include<cstdio>
using namespace std;
int ans;
int main()
{    int d1,d2;
    cin>>d1>>d2;
    int yr1,yr2;
    yr1=(d1-d1%1000)/1000;
    yr2=(d2-d2%1000)/1000;
    for(register int i=yr1;i<=yr2;i++)//i为年份,abcd拆分四位数; 
    {    int a,b,c,d;
        a=(i-i%1000)/1000;d=i%10;
        b=(i-a-i%100)/100;c=i-a-b-d;
        if(a==d&&b==c)//验证是否是回文 
            {    if(i%4==0)//闰年验证 
                {    if(i%100==0)continue;//闰年中特殊年份舍去;
                    else
                    {    if((10*d+c)<=12&&(10*d+c)>0)//判断日期; 
                        {    if(10*d+c==1&&(10*b+a)<=31)ans++;
                            if(10*d+c==2&&(10*b+a)<=29)ans++;//闰年2月日期不同; 
                            if(10*d+c==3&&(10*b+a)<=31)ans++;
                            if(10*d+c==4&&(10*b+a)<=30)ans++;
                            if(10*d+c==5&&(10*b+a)<=31)ans++;
                            if(10*d+c==6&&(10*b+a)<=30)ans++;
                            if(10*d+c==7&&(10*b+a)<=31)ans++;
                            if(10*d+c==8&&(10*b+a)<=31)ans++;
                            if(10*d+c==9&&(10*b+a)<=30)ans++;
                            if(10*d+c==10&&(10*b+a)<=31)ans++;
                            if(10*d+c==11&&(10*b+a)<=30)ans++;
                            if(10*d+c==12&&(10*b+a)<=31)ans++;
                            else continue;//日期不符; 
                        }
                        else continue;//月份不符 
                    }
                }
                else//非闰年 
                {    if((10*d+c)<=12&&(10*d+c)>0)//判断日期; 
                    {    if(10*d+c==1&&(10*b+a)<=31)ans++;
                        if(10*d+c==2&&(10*b+a)<=28)ans++;
                        if(10*d+c==3&&(10*b+a)<=31)ans++;
                        if(10*d+c==4&&(10*b+a)<=30)ans++;
                        if(10*d+c==5&&(10*b+a)<=31)ans++;
                        if(10*d+c==6&&(10*b+a)<=30)ans++;
                        if(10*d+c==7&&(10*b+a)<=31)ans++;
                        if(10*d+c==8&&(10*b+a)<=31)ans++;
                        if(10*d+c==9&&(10*b+a)<=30)ans++;
                        if(10*d+c==10&&(10*b+a)<=31)ans++;
                        if(10*d+c==11&&(10*b+a)<=30)ans++;
                        if(10*d+c==12&&(10*b+a)<=31)ans++;
                        else continue;//日期不符; 
                    }
                    else continue;//月份不符; 
                } 
            }
        else continue;//不符合回文日期; 
    }
    cout<<ans<<endl; 
return 0;}

怕自己脑子乱,没删注解,AC了三个点,求指导


by pineapples @ 2017-10-04 20:10:32

复杂自然就难找错了,建议枚举月日,推出回文日期再判断吧 不要去纠结。我一开始也是好复杂好多判断,说不定哪里一个大括号错位就错了呢,所以放宽心,学更简洁的,学更好的模拟思想啊


|