zoukankan      html  css  js  c++  java
  • B

    计算机系统中使用的UTC时间基于原子钟,这种计时方式同“地球自转一周是24小时”的计时方式有微小的偏差。为了弥补这种偏差,我们偶尔需要增加一个“闰秒”。  

    最近的一次闰秒增加发生在UTC时间2016年的最后一天。我们在2016年12月31日23时59分59秒和2017年1月1日0时0分0秒之间增加了这样一秒:2016年12月31日23时59分60秒,记作2016-12-31 23:59:60。  

    目前一共增加了27次闰秒,具体添加的时间见下表:

    给出两个时间,请你判断在考虑闰秒的情况下,这两个时间间隔多少秒。  

    Input

    两个时间各占一行,格式是yyyy-MM-dd HH:mm:ss,范围在1970-01-01 00:00:00至2017-03-12 23:59:59之间。保证第一个时间不晚于第二个时间。

    Output

    两个时间间隔多少秒。

    Sample Input

    2016-12-31 23:59:59 
    2017-01-01 00:00:00

    Sample Output

    2

    实验代码

    #include<stdio.h>
    #include<string.h>
    #include<stdbool.h>
    #include<math.h>
    typedef long long ll;
    ll ans[5];
    int Y[15]= {0,31,28,31,30,31,30,31,31,30,31,30,31}; //nor
    char c[3][3][33]; // 0 y-m-d  1 h-mi-s
    int y[5],m[5],d[5],h[5],mi[5],s[5];
    int data[3000][5];
    bool runnian(int a)
    {
        if((a%4==0&&a%100!=0)||a%400==0) return 1;
        else return 0;
    }
    void debug()
    {
        printf("%d %d %d**
    ",y[1],m[1],d[1]);
        printf("%d %d %d
    ",h[1],mi[1],s[1]);
        printf("%d %d %d
    ",y[2],m[2],d[2]);
        printf("%d %d %d
    ",h[2],mi[2],s[2]);
    }
    void init()
    {
        memset(ans,0,sizeof(ans));
        memset(y,0,sizeof(y));
        memset(m,0,sizeof(m));
        memset(d,0,sizeof(d));
        memset(h,0,sizeof(h));
        memset(mi,0,sizeof(mi));
        memset(s,0,sizeof(s));
        data[1972][1]=1;
        data[1972][2]=1;
        for(int i=1973; i<=1979; i++) data[i][2]=1;
        for(int i=1981; i<=1983; i++) data[i][1]=1;
        data[1985][1]=1;
        data[1987][2]=1;
        data[1989][2]=1;
        data[1990][2]=1;
        for(int i=1992; i<=1994; i++) data[i][1]=1;
        data[1995][2]=1;
        data[1997][1]=1;
        data[1998][2]=1;
        data[2005][2]=1;
        data[2008][2]=1;
        data[2012][1]=1;
        data[2015][1]=1;
        data[2016][2]=1;
    }
    
    ll ansy=365*24*3600;
    ll calnian(int y)
    {
        ll ans=0;
        for(int i=1970; i<=y; i++) //年
        {
            ans+=ansy;
            if(runnian(i)) ans+=24*60*60;
            if(data[i][1]) ans++;
            if(data[i][2]) ans++;
        }
        return ans;
    }
    
    ll calyue(int y,int m)
    {
        ll ans=0;
        for(int j=1; j<=m; j++) //月
        {
            ans+=Y[j]*24*60*60;
            if(j==2&&runnian(y)) ans+=24*60*60; //闰年2月+一天
            if(j==6&&data[y][1]) ans++;//闰秒也要
            if(j==12&&data[y][2]) ans++;
        }
        return ans;
    }
    
    ll calday(int y,int m,int d)
    {
        int f=0;
        ll ans=0;
        if(runnian(y)&&m==2) ans+=24*3600;
        ans+=d*24*3600;
        if(m==6&&data[y][1]) ans++;
        return ans;
    }
    
    int main()
    {
        init();
        for(int i=1; i<=2; i++)
            scanf("%d-%d-%d %d:%d:%d",&y[i],&m[i],&d[i],&h[i],&mi[i],&s[i]);
            //debug();
        for(int x=1; x<=2; x++)
        {
            ans[x]+=calnian(y[x]-1);
            ans[x]+=calyue(y[x],m[x]-1);
            ans[x]+=calday(y[x],m[x],d[x]-1);
            ans[x]+=h[x]*3600;
            ans[x]+=mi[x]*60;
            ans[x]+=s[x];
        }
        printf("%lld
    ",ans[2]-ans[1]);
        return 0;
    }
    

      

    设计思路

    此代码我经过借鉴,自己乱改了一下,没想到过了(原本的代码

    这道题我搞了半天发现还是不会做,于是就去找度娘,找了好多种代码,没一个能过。后来我就随便拿一个大佬代码,自己乱改一波,居然过了。哈哈哈~~

    看到这个代码,发现好多知识点都不知道,我觉得我还是先去看书吧,丰富一下知识点。这题目~~唉,跟其他大佬的一波风算了...

  • 相关阅读:
    C/C++中变量的作用域和存储类型简介
    Java与JavaScript的区别你明白吗?
    js-2018-11-09 关于Array中的srot()方法和compare()方法
    js-2018-11-01 关于break和continue语句
    0427表格学习
    0426基础标签学习
    css3部分整理
    img图片占不满整个div
    基于google protobuf 的 socket udp 通信
    微信小程序echarts学习记录
  • 原文地址:https://www.cnblogs.com/xirfly/p/10258066.html
Copyright © 2011-2022 走看看