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; } } |
// 不知道為什麼我用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;
}