两段有问题的代码,求改第二段

P2010 [NOIP2016 普及组] 回文日期

koukou12138 @ 2022-06-21 21:54:17

#include<bits/stdc++.h>
using namespace std;
int year1,month1,day1,year2,month2,day2,year,month,day,num=0;
string a1,a2;
int nian(int yearr)
{
    int i;
    if((yearr%4==0&&yearr%100!=0)||yearr%400==0) i=1;
    else i=0;
    return i;
}
int tiann(int yearr,int monthh)
{
    int i;
    if(monthh==2) i=28+nian(yearr);
    else if(monthh==4||monthh==6||monthh==9||monthh==11) i=30;
    else i=31;
    return i;
}
int main()
{
    string bm,bd,bb;
    cin>>a1>>a2;
    year=stoi(a1.substr(0,4));
    month=stoi(a1.substr(4,2));
    day=stoi(a1.substr(6,2));
    year2=stoi(a2.substr(0,4));
    month2=stoi(a2.substr(4,2));
    day2=stoi(a2.substr(6,2));
    for(;;day++)
    {
        if(year==year2&&month==month2&&day==day2+1) break;
        if(day>tiann(year,month)){day=1;month+=1;}
        if(month>12){month=1;year+=1;}
        if(day<10) bd="0"+to_string(day);
        else bd=to_string(day);
        if(month<10) bm="0"+to_string(month);
        else bm=to_string(month);
        bb=to_string(year)+bm+bd;
        if(bb[7]==bb[0]&&bb[6]==bb[1]&&bb[5]==bb[2]&&bb[4]==bb[3]) {num++;} 
    }
    if(a1==a2&&num!=0) num==1;
    cout<<num;
    return 0;
}

第一段代码,通过字符串-数-字符串的转化与暴力枚举获得答案,但是每一次循环都要进行6次if判定,于是有一个测试点超时

于是我删去了数转字符串的环节,直接对数进行判定和暴力枚举:

#include<bits/stdc++.h>
using namespace std;
int year2,month2,day2,year,month,day,num=0;
string a1,a2;
int nian(int yearr)
{
    int i;
    if((yearr%4==0&&yearr%100!=0)||yearr%400==0) i=1;
    else i=0;
    return i;
}
int tiann(int yearr,int monthh)
{
    int i;
    if(monthh==2) i=28+nian(yearr);
    else if(monthh==4||monthh==6||monthh==9||monthh==11) i=30;
    else i=31;
    return i;
}
int main()
{
    cin>>a1>>a2;
    year=stoi(a1.substr(0,4));
    month=stoi(a1.substr(4,2));
    day=stoi(a1.substr(6,2));
    year2=stoi(a2.substr(0,4));
    month2=stoi(a2.substr(4,2));
    day2=stoi(a2.substr(6,2));
    for(;;day++)
    {
        if(year==year2&&month==month2&&day==day2+1) break;
        if(day>tiann(year,month)){day=1;month+=1;}
        if(month>12){month=1;year+=1;}
        if(year==month%10*10+month/10*10+day/10*100+day%10*1000) num++;
    }
    if(a1==a2&&num!=0) num==1;
    cout<<num;
    return 0;
}

时间是过了,但是,有三个测试点WA!

最迷的是我下了#1数据然后自己测,输出没有错。

求助大佬指出错误!


by TeraniRetZiger @ 2022-06-21 22:06:11

@koukou12138 遇到这种玄学问题多半是因为输入输出。或者是说,你的代码里有未定义行为。比如运算符优先级,各个版本的C++都有不同。这里由于时间关系,我无法提出较好的修改建议。在修改代码的时候,建议多关注那些未定义行为什么的。反正大眼干瞪就完了


by TeraniRetZiger @ 2022-06-21 22:08:31

@koukou12138 if(a1==a2&&num!=0) num==1; 人 类 迷 惑 行 为


by TeraniRetZiger @ 2022-06-21 22:12:21

这里提供一种可能有用的方法:不要用数字来比较,把数字拼成字符串,再用字符串来比较,这样出错率比较低


by y_kx_b @ 2022-06-21 22:12:25

@Static_int 一开始写很容易把 === 弄混,别问我为什么(


by koukou12138 @ 2022-06-21 22:40:56

@Static_int

if(a1==a2&&num!=0) num==1; 这一段是我之前改代码的时候忘删了[捂脸]

等等,这才是真正的迷惑行为:

if(year==month%10*10+month/10*10+day/10*100+day%10*1000) num++;//error;
if(year==month%10*10+month/10+day/10*100+day%10*1000) num++;//right

我,离个大谱


by koukou12138 @ 2022-06-21 22:42:30

@Static_int 还有,字符串这法子我试过了,就是第一段代码,有一个点超时了,机测花了两分半才出结果


by TeraniRetZiger @ 2022-06-22 12:08:57

草,给整魔怔了


|