纯暴力求找错:)

P2010 [NOIP2016 普及组] 回文日期

xyz0815 @ 2019-05-29 15:07:13

#include<iostream>
#include<cstring>
#include<cmath>
using namespace std;
char a[10],b[10],s[10];
int mon[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
int cnt,ys,yf,ms,mf,ds,df;
int con(char x[],int y,int z)//将字符串转为数字 
{
    int s=0;
    for(int i=y;i<=z;i++)
    {
        s+=int(x[i]-'0')*pow(10,double(z-i));
    }
    return s;
}
void cons(int x,int y,int z)//将数字转为字符串 
{
    for(int i=y;i<=z;i++)
    {
        s[i]=char((x/int(pow(10,double(z-i))))%10)+'0';
    }
    return;
}
bool check(char x[],char y[])//判断字符是否回文 
{
    char z[10];
    int c=0;
    for(int i=7;i>=0;i--)
        z[c++]=y[i];
    z[c]='\0';
    if(strcmp(z,x)==0)
        return 1;
    else
        return 0;
}
bool run(int y)
{
    if((y%4==0&&y%100!=0)||y%400==0)
        return 1;
    else 
        return 0;
}
bool ok(int y,int md)
{
    int m,d;
    m=md/1000%10*10+md/100%10;
    d=md/10%10*10+md%10;
    if(y==ys)
    {
        if(m<ms||(m==ms&&d<ds))
            return 0;
    }
    if(y==yf)
    {
        if(m>mf||(m==mf&&d>df))
            return 0;
    }
    if(m>=1&&m<=12)
    {
        if(m==2)
        {
            if(run(y))
            {
                if(d>=1&&d<=mon[m]+1)
                {
                    return 1;
                }
            }   
        }
        if(d>=1&&d<=mon[m])
        {
            return 1;
        }
    }
    return 0;
}
int main()
{
    cin>>a>>b;
    int i,j,t;
    char m[5];
    ys=con(a,0,3);
    yf=con(b,0,3);
    ms=con(a,4,5);
    mf=con(b,4,5);
    ds=con(a,6,7);
    df=con(b,6,7);
    if(ys==yf&&ms==mf&&ds==df)
    {
        if(check(a,b))
        {
            cout<<1;
            return 0;
        }
        else
        {
            cout<<0;
            return 0;
        }
    }
    for(i=ys;i<=yf;i++)
    {
        t=0;
        cons(i,0,3);
        for(j=3;j>=0;j--)
        {
            m[t++]=s[j];
        }
        t=con(m,0,3);
        if(ok(i,t))
        {
            cnt++;
        }
    }
    cout<<cnt;
    return 0;
}

可读性有些差......


by charliegong @ 2019-05-29 15:13:51

#include<iostream>
#include<cstring>
#include<algorithm>
#include<stdio.h>
using namespace std;
int m[13]={31,28,31,30,31,30,31,31,30,31,30,31};
bool hv(int x){
    int a[10]={x/10000000,x/1000000%10,x/100000%10,x/10000%10,x/1000%10,x/100%10,x/10%10,x%10};
    if(a[0]==a[7]&&a[1]==a[6]&&a[2]==a[5]&&a[3]==a[4]) return true;
    return false;
}
bool rq(int x){
    m[1]=28;
    int day=x%100;
    int month=x%10000/100;
    int year=x/10000;
    if(day>31) return false;
    if(month>12) return false;
    bool flag=false;
    int a=year%4;
    int b=year%100;
    int c=year%400;
    if(a==0){
        if(b!=0) m[1]=29;
        if(b==0&&c==0) m[1]=29;
    }
    if(m[month-1]<day) return false;
    return true;
}
int main()
{
    int i,j,n,m,sum=0;
    scanf("%d %d",&n,&m);
    for(int i=n;i<=m;i++)
    {
        if(hv(i)==true&&rq(i)==true) sum++;
        int day=i%100;
        if(day>31) i+=68;
    }
    printf("%d",sum);
    return 0;
}

码风更烂…………


by charliegong @ 2019-05-29 15:14:07

@xyz0815


|