题解 | #日期差值#

日期差值

http://www.nowcoder.com/questionTerminal/ccb7383c76fc48d2bbc27a2a6319631c

//繁琐但直接的思路
#include<iostream>
using namespace std;

int yy[2][12]={                                 //每月天数
        {31,28,31,30,31,30,31,31,30,31,30,31},
        {31,29,31,30,31,30,31,31,30,31,30,31}
    };

bool isrun(int year){                             //判断闰年
    return ((year%4==0&&year%100!=0)||year%400==0);
}
int rundays(int year){                          //对应天数
    if(isrun(year))return 366;
    else return 365;
}
bool compare(int year1,int month1,int day1,int year2,int month2,int day2){  //比较日期前后
    if(year1>year2||(year1==year2&&month1>month2)||(year1==year2&&month1==month2&&day1>day2))
        return false;
    else return true;
}
int main(){
    char s1[9],s2[9];
    int year1,month1,day1,year2,month2,day2;
    while(cin>>s1>>s2){
        int number=1;                //数据处理(直接用int做除法应该更简单)
        year1=(s1[0]-'0')*1000+(s1[1]-'0')*100+(s1[2]-'0')*10+(s1[3]-'0');
        month1=(s1[4]-'0')*10+(s1[5]-'0');
        day1=(s1[6]-'0')*10+(s1[7]-'0');
        
        year2=(s2[0]-'0')*1000+(s2[1]-'0')*100+(s2[2]-'0')*10+(s2[3]-'0');
        month2=(s2[4]-'0')*10+(s2[5]-'0');
        day2=(s2[6]-'0')*10+(s2[7]-'0');
        
        if(!compare(year1,month1,day1,year2,month2,day2)) {  //较小日期放到前面
            int t;
            t=year1;
            year1=year2;
            year2=t;
            t=month1;
            month1=month2;
            month2=t;
            t=day1;
            day1=day2;
            day2=t;
        }
                                          //分情况从第一个日期开始累计
        if(year1!=year2){                  //不同年
            int run=isrun(year1);          
            number+=yy[run][month1-1]-day1;
            while(month1<12)number+=yy[run][month1++];
            year1++;
            while(year1<year2){
                number+=rundays(year1++);
            }
            run=isrun(year2);
            while(month2>1)number+=yy[run][(month2--)-2];
            number+=day2;
        }
        else if(month1!=month2){  //同年不同月
            int run=isrun(year1);
            number+=yy[run][month1-1]-day1;
            while(month1+1<month2)number+=yy[run][month1++];
            number+=day2;
        }      
        else number+=(day2-day1);   //同年同月不同日
        
        cout<<number<<endl;
        }
    
    return 0;
}
全部评论

相关推荐

2025-12-26 10:52
河北传媒学院 Java
点赞 评论 收藏
分享
时间线:&nbsp;1.4-1.5:&nbsp;boss&nbsp;牛客&nbsp;官网&nbsp;实习僧海投了两天,&nbsp;感觉确实没啥招人的啊,&nbsp;心里凉了一半.1.6:&nbsp;中午快手约面,&nbsp;下午字节hr飞书私聊约面,&nbsp;当时想着第一次面大厂感觉三个过一个一面就已经赢了.1.7:&nbsp;下午&nbsp;3点大厂处女面,&nbsp;哈哈面试官是重邮红岩的直接保送;&nbsp;5点快手一面,&nbsp;我说这个是我的第二次大厂面试,&nbsp;面试官问要是拿到字节和快手选择哪个,&nbsp;我说昨天看了一晚上快手百分百选快手哈哈哈.&nbsp;晚上5.30字节约二面,&nbsp;快手约二面,&nbsp;小红书约一面.1.8:&nbsp;下午2点快手二面,&nbsp;聊天面体验非常好(当天电话确认入职时间);&nbsp;4点字节二面这次不是校友了,&nbsp;然后有一个CSS实现switch效果的忘记属性咋写了,&nbsp;感觉危了;&nbsp;7.30&nbsp;问字节hr是不是挂了;&nbsp;9点开始小红书一面,&nbsp;难死我了,&nbsp;但我还是笑着面完了,&nbsp;然后卸载了小红书,&nbsp;但是过了一会会小红书hr约二面,&nbsp;遂下回来了字节约三面.1.9:&nbsp;下午2点字节三面,&nbsp;依旧聊天+算法,&nbsp;自己太菜了有一个写错了,&nbsp;面完感觉又危了;&nbsp;5点面小红书20min结束(offer审批);5.30又去问字节hr是不是挂了,&nbsp;hr小姐姐说干嘛用一个句式,&nbsp;我说手写题又又又没写出来😂,&nbsp;2min后约hr面;8.30&nbsp;快手offer总结,&nbsp;自己运气好遇到了好公司好部门好面试官,&nbsp;字节剪映&nbsp;快手电商&nbsp;小红书支付的面试体验都非常好,&nbsp;不会的题会带你一步一步思考,&nbsp;流程也非常快全部都是当天推进,&nbsp;小红书是以分钟为单位推进.&nbsp;&nbsp;面经以及细节等我慢慢整理,&nbsp;&nbsp;以及保佑所有的审批不要出问题,&nbsp;我是真怕最后全过了0offer😂bg:&nbsp;重邮&nbsp;大数据&nbsp;蓝山工作室&nbsp;一段非大厂实习
独角仙梦境:这是真👻了
找实习记录
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务