Zerojudge 基礎題庫a263 日期差幾天


這題是一個很注重細節的題目
因為曆法裡有一個很討厭的東西:閏年
一開始我本來想用日期減法來算
但最後結果是: 太複雜了。
所以我去網路看有甚麼東西可簡化這題目
當然,找到了,就是這句話:
算出0001/1/1到第一個日期的時間,再算出0001/1/1到第二個日期的時間。
把兩者互減在絕對值,就是答案。
基本上,您看到這,你可以去試試了。
如果還不知道怎辦,一些提示提供給你:

記得考慮閏年 一年除以4可整除而且不可整除100,或是整除400的是閏年
做一個檢查閏年的函數會有很大的幫助喔

如果你覺得月份計算很煩,看看這兩段程式碼
int normal_months[13] = {0,31,28,31,30,31,30,31,31,30,31,30,31};
int lunar_months[13] = {0,31,29,31,30,31,30,31,31,30,31,30,31};

好啦,夠多提示啦,如果腦細胞全死光了,這是程式碼:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
#include <iostream>
#include <cmath>
using namespace std;

/*
2019/12/14 11:20 finished
oh my god it is so hard
*/
int normal_months[13] = {0,31,28,31,30,31,30,31,31,30,31,30,31};
int lunar_months[13] = {0,31,29,31,30,31,30,31,31,30,31,30,31};

bool check_lunar(int year)
{
    if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0)
    {
        return true;
    }
    else
    {
        return false;
    }
}

int distance_to_first_date(int year,int month,int day)
{
    int distance_ans = 0;
    //cal years
    for (int i = 1; i < year; i++)
    {
        if (check_lunar(i) == 1)
        {
            distance_ans += 366;
        }
        else
        {
            distance_ans += 365;
        }
    }

    //cal month
    if (check_lunar(year) == 1)
    {
        for (int i = 1; i < month; i++)
        {
            distance_ans += lunar_months[i];
        }
    }
    else
    {
        for (int i = 1; i < month; i++)
        {
            distance_ans += normal_months[i];
        }
    }
    //cal day
    distance_ans += (day - 1);
    return distance_ans;



}
int main()
{
    //input
    int a1,a2,a3,b1,b2,b3;
    while(cin >> a1 >> a2 >> a3)
    {
        cin >> b1 >> b2 >> b3;

        //get ans
        int ans = abs(distance_to_first_date(a1,a2,a3) - distance_to_first_date(b1,b2,b3));
        //output
        cout << ans << endl;
    }




}

留言

  1. // 不知道為什麼我用c語言就是不能過
    // 已經完全仿造您的程式碼了
    // 我一開始是自己寫的,有自己想到利用 1/1/1 來做
    // 謝謝您提供的程式碼唷

    #include
    #include

    int count(int year, int month, int day);
    int leap_test(int year);


    int normal_month[13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
    int leap_month[13] = {0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};


    int main()
    {
    int y1, m1, d1;
    while(scanf("%d %d %d", &y1, &m1, &d1) != EOF){
    int y2, m2, d2;
    scanf("%d %d %d", &y2, &m2, &d2);

    printf("%d\n", abs(count(y1, m1, d1) - count(y2, m2, d2)));
    }
    return 0;
    }


    int leap_test(int year)
    {
    if ( ((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0))
    return 1;
    else
    return 0;
    }

    int count(int year, int month, int day)
    {

    int result = 0;

    // count year
    for(int i = 1; i < year; i++)
    if(leap_test(year))
    result += 366;
    else
    result += 365;

    // count month
    if (leap_test(year))
    for(int i = 1; i < month; i++)
    result += leap_month[i];
    else
    for(int i = 1; i < month; i++)
    result += normal_month[i];

    // count day
    result += day - 1;
    return result;
    }


    回覆刪除

張貼留言

這個網誌中的熱門文章

Zerojudge 基礎題庫a004 文文的求婚 (Python)

紙蜻蜓的受風面積與紙蜻蜓落地時間的關係 #1 [實驗歷程與Python Matplotlib]

Zerojudge 基礎題庫a013 羅馬數字 (Python)