已经能正确获得年月日,然后求距离日的结果在自己电脑上能过很多例子,但是这里总是两个测试点过不去,也不知道是什么数据,求帮忙看看哪的问题!!!
我的思路是(我在下面代码里注释了): 假如要求2020-4-15.那么计算每一年的日子(从公元1年到2019年算出这些年总共多少天,其中判断好了闰的情况),所以现在需要算2020年4月之前的日子(本2020年1-3月),也可以算出,最后再算日子,就是15-1天(4月2-15,从2是因为世界第一天是1年1月1号,前面的计算得到的都是1号对应天数). 最后单独判断今年是不是闰年(因为月份数组二月设置的是28),如果今年闰而且所求的超过2月29号,那么ans++。 请大家帮忙看看哪里不对。
#include<iostream>
#include <cstring>
using namespace std;
bool isR(int n);
int main(){
int y=0,m=0,d=0,ans=0;
string year[12]={
"JAN","FEB","MAR","APR","MAY","JUN","JUL",
"AUG","SEP","OCT","NOV","DEC"
};
int mon[13]={0,31, 28, 31,30,31,30,31,31,30,31,30,31};
string str,sy,sm,sd;
cin>>str;
int flag=0;
for(int i=0;i<str.length();i++){
//cout<<str[i]<<"--";
if(!isdigit(str[i])){
//month
//sm=strcat(sm,str[i]);
sm+=str[i];
flag=1;
}
else if(flag==0 && isdigit(str[i]) ){
//day
//sd=strcat(sd,str[i]);
sd+=str[i];
}
else if(flag==1 && isdigit(str[i]) ){
//year
//sy=strcat(sy,str[i]);
sy+=str[i];
}
}
for(int i=0;i<sy.length();i++){
y*=10;
y+=sy[i]-'0';
}
for(int i=0;i<12;i++){
if(sm==year[i]){
m=i+1;
break;
}
}
for(int i=0;i<sd.length();i++){
d*=10;
d+=sd[i]-'0';
}
//cout<<"The time: "<<y<<"-"<<m<<"-"<<d<<endl;//转换success
/*下面求距离日:为什么不成功??? */
int t1,t2,t3;
//从公元1年到y-1年这些年总共多少天
for(int i=2;i<=y;i++){
if(isR(i-1)){ //上一年们
ans+=366;
}else{
ans+=365;
}
}
for(int i=2;i<=m;i++){ //上一月们
ans+=mon[i-1];
}
ans+=d-1;
if(y == 1582 && m == 10 && (d > 4 && d < 15)){
ans-=(d-4);
}
else if( !(y<=1582 && m<=10 && d<15) ){
ans-=10;
}
if( isR(y) && !( m<=2 && d<=29 ))
//今年(是闰年),一旦进入3月则说明要闰2月,天数加一。
{ans++;}
//cout<<"经历计算了:"<<t1<<"年"<<t2<<"月"<<t3<<"日"<<endl;
cout<<ans<<endl;
return 0;
}
//4OCT1582: (577736).....1582-10-15: (577737).....21NOV2020: 73775 3/0(737751)
bool isR(int k){
if(k < 1582)return k % 4 == 0;
if(k % 400 == 0)return true;
if(k % 4 == 0 && k % 100 != 0)return true;
return false;
}