数学方法

P2010 [NOIP2016 普及组] 回文日期

Rey_HR @ 2017-11-01 19:26:14

//数学方法 
#include<bits/stdc++.h>
using namespace std;
int tot=0;
int mon[12]={31,28,31,30,31,30,31,31,30,31,30,31};//每月天数 
int n,m;
int dal_zj(int k);
int main()
{
    cin>>m>>n;
    for(int i=m/10000;i<=n/10000;++i)//每一年至多只有1个满足条件 
      dal_zj(i);
      cout<<tot;
}
int dal_zj(int k)//函数判断此年有没有回文日期
{
    int a,b,c,d,p,s;
    a=k/1000;
    b=k/100%10;
    c=k%100/10;
    d=k%10;
    p=a*10+b;s=c*10+d;
   if((p!=0&&p%4==0)||(p==0&&s%4==0)) mon[1]++;//闰年判断 mon【1】就是2月 
   if((d*10+c<=12)&&mon[d*10+c-1]>=b*10+a&&a*10000001+b*1000010+c*100100+d*11000>=m&&a*10000001+b*1000010+c*100100+d*11000<=n) tot++;
     //判断  d*10+c为月  b*10+a为日 且该数在m,n之间 
   if((p!=0&&p%4==0)||(p==0&&s%4==0)) mon[1]--;    //恢复 
}

by 牙神幻十郎 @ 2017-11-03 21:26:14

其实枚举年份没有按月份枚举好写,但是效率高些。。不重要


by 姜维 @ 2017-11-08 22:32:44

#include <iostream>
#include <cmath>
#include <cstring>
#include <cstdio>
using namespace std;
int s[13]={0,31,29,31,30,31,30,31,31,30,31,30,31};
int main()
{
    int m,n,k=0,a=0,b=0;
    scanf("%d %d",&m,&n);
    if(m==n)
    {
        char x[10];
        int k=0;
        sprintf(x,"%d",m);
        for(int i=0;i<4;i++)
        {
            if(x[i]==x[7-i])
                k++;
        }
        if(k==4)
            cout<<'1';
        else
            cout<<'0';
        return 0;        
    }
    for(int i=1;i<=12;i++)
    {
        for(int j=1;j<=s[i];j++)
        {
            a=(j%10)*1000+(j/10)*100+(i%10)*10+(i/10);
            b=a*10000+i*100+j;
            if(b>=m&&b<=n)
                k++;              
        }
    }
    cout<<k;
    return 0;
}

|