BUPT复试专题—日期(2013)

题目描述

请你计算出第日是第X年的第几天。其中,1月1日是第一天,1月2日是第二天,以此类推。

计算时请注意闰年的影响。对于非整百年,年数能整除4是闰年,否则不是闰年;对于整百年,年数能整除400是闰年,否则不是闰年。如1900年和1901年不是闰年,而2000年和2004年是闰年。

输入

第一行有一个整数 ,表示一共有T组数据需要你处理。
接下来一共有T行,每行是一个如下格式的字符串:::,表示你需要计算第日是第年的第几天。其中是一个大于0,小于2100的整数。保证字符串的格式都是合法的,字符串所表示的日期也都是存在的。

输出

对于每组数据,你需要输出一个整数,表示所求得的结果。

样例输入

2
2013:4:12
112:4:12

样例输出

102
103

来源

2013机考A题 

#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;
}
原文地址:https://www.cnblogs.com/dzzy/p/8576581.html