T156530 儒略历。始终有两个测试点过不去,请问是为什么呀
  • 板块学术版
  • 楼主xiaolongxia
  • 当前回复3
  • 已保存回复3
  • 发布时间2020/12/15 16:04
  • 上次更新2023/11/5 06:06:14
查看原帖
T156530 儒略历。始终有两个测试点过不去,请问是为什么呀
437752
xiaolongxia楼主2020/12/15 16:04

已经能正确获得年月日,然后求距离日的结果在自己电脑上能过很多例子,但是这里总是两个测试点过不去,也不知道是什么数据,求帮忙看看哪的问题!!!


我的思路是(我在下面代码里注释了): 假如要求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;
}
2020/12/15 16:04
加载中...