BUPT复试专题—日期(2013)
题目描述
请你计算出第年月日是第X年的第几天。其中,1月1日是第一天,1月2日是第二天,以此类推。
计算时请注意闰年的影响。对于非整百年,年数能整除4是闰年,否则不是闰年;对于整百年,年数能整除400是闰年,否则不是闰年。如1900年和1901年不是闰年,而2000年和2004年是闰年。
输入
第一行有一个整数 ,表示一共有T组数据需要你处理。
接下来一共有T行,每行是一个如下格式的字符串:::,表示你需要计算第年月日是第年的第几天。其中是一个大于0,小于2100的整数。保证字符串的格式都是合法的,字符串所表示的日期也都是存在的。
接下来一共有T行,每行是一个如下格式的字符串:::,表示你需要计算第年月日是第年的第几天。其中是一个大于0,小于2100的整数。保证字符串的格式都是合法的,字符串所表示的日期也都是存在的。
输出
对于每组数据,你需要输出一个整数,表示所求得的结果。
样例输入
2
2013:4:12
112:4:12
样例输出
102
103
来源
#include<iostream> #include<cstdio> #include<algorithm> #include<string> using namespace std; int main() { int T; cin>>T; while(T--) { string donser; cin>>donser; int m=donser.find(':'),sum=0; for(int i=0;i<m;i++) //////year { sum+=donser[i]-'0'; if(i!=m-1) sum*=10; } int lable=0; if(sum%100==0) { if(sum%400==0) lable=1; } else if(sum%100!=0) { if(sum%4==0) lable=1; } donser.erase(donser.begin(),donser.begin()+m+1); int m1=donser.find(':'),sum1=0; for(int i=0;i<m1;i++) //////month { sum1+=donser[i]-'0'; if(i!=m1-1) sum1*=10; } donser.erase(donser.begin(),donser.begin()+m1+1); int m2=donser.size(),sum2=0; for(int i=0;i<m2;i++) //////day { sum2+=donser[i]-'0'; if(i!=m2-1) sum2*=10; } //cout<<sum<<" "<<sum1<<" "<<sum2<<" "<<endl; int number=0; for(int i=1;i<sum1;i++) { if(i==1||i==3||i==5||i==7||i==8||i==10||i==12) number+=31; else if(i==2&&lable==0) number+=28; else if(i==2&&lable==1) number+=29; else number+=30; } number+=sum2; cout<<number<<endl; } return 0; }