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
草,给整魔怔了