有兩個日期,求兩個日期之間的天數

題目描述

有兩個日期,求兩個日期之間的天數,如果兩個日期是連續的我們規定他們之間的天數爲兩天
輸入描述:
有多組數據,每組數據有兩行,分別表示兩個日期,形式爲YYYYMMDD

輸出描述:
每組數據輸出一行,即日期差值

示例1
輸入

20110412
20110422

輸出

11

代碼

#include <iostream>
#include <cstdio>
#include <string>
#include <math.h>

using namespace std;

int datas[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}};
int isLeapYear(int year){
    return (year%4==0&&year%100!=0)||year%400==0;
}
int numberOfYear(int year){
    if(isLeapYear(year)) 
        return 366;
    else 
        return 365;
}
// 思路就是 年計算相對值,日期計算本年的值,然後多的年日期-少的年日期;+年的日子;
int main(){
    string time1;
    string time2;
    int year,month,day,year2,month2,day2;
    while(getline(cin,time1)&&getline(cin,time2)){
        int num=1; //更好的讀入方法:
        int flag = time1.compare(time2);
        year=stoi(time1.substr(0,4));
        year2=stoi(time2.substr(0,4));
        month=stoi(time1.substr(4,2));
        month2=stoi(time2.substr(4,2));
        day=stoi(time1.substr(6,2));
        day2=stoi(time2.substr(6,2));
        
        int numOfYear=abs(year-year2);
        // 函數化處理:
        int num1,num2;
        num1=num2=0;
        for(int i=0;i<month-1;i++){
            num1+=datas[isLeapYear(year)][i];
        }
        num1+=day;
         for(int i=0;i<month2-1;i++){
            num2+=datas[isLeapYear(year2)][i];
        }
        num2+=day2;
        if(flag>0){// first is biger
            while(numOfYear>0){
                num+=numberOfYear(year);
                year--;
                numOfYear--;
            }
            num+=(num1-num2);
        }else{
             while(numOfYear>0){
                num+=numberOfYear(year);
                year++;
                numOfYear--;
            }
            num+=(num2-num1);
        }
        printf("%d\n",num);
    }
    
    return 0;
}

優秀答案:

#include<stdio.h>
#define leap(x) (x%400==0||(x%4==0&&x%100!=0)?1:0)
#define Abs(x) ((x)>0?(x):-(x))
typedef struct date
{
    int y, m, d;
}Date;

const int yd[2][13]={{0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31},
                     {0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}};
                      
int days(Date x)
{
    int sum=0, i;
    int y=x.y, m=x.m, d=x.d;
    for(i=0; i<y; i++)
    {
        if(leap(i))
        {
            sum+=366;
        }
        else
        {
            sum+=365;
        }
    }
    for(i=1; i<m; i++)
    {
        sum+=yd[leap(y)][i];
    }
    sum+=d;
    return sum;
}
// 計算日期相對於0000 00 00 的日子;
int main(void)
{
    Date a, b;
    while(scanf("%4d%2d%2d", &a.y, &a.m, &a.d)!=EOF) //讀取固定的格式數據:
    {
        scanf("%4d%2d%2d", &b.y, &b.m, &b.d);
        printf("%d\n", Abs(days(a)-days(b))+1);
    }
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章