二、day of week
一、日期差值
1、題目和要求
時間限制:1s,記憶體限制:32mb,特殊判題:否
2、總結
1)閏年的判斷規則:當年數不能被100整除且能被4整除則為閏年,或者其能被
400整除時也是閏年。某種情況下,可能出現兩個閏年相隔 8 年。
2)可以採用巨集定義函式的方式判斷是否是閏年,巨集定義函式的處理過程是:預處理器用複製巨集**的方式代替函式的呼叫,省去了函式壓棧退棧過程,提高了效率。
#define isyeap(x) x%100!=0 && x%4==0 || x%400==0 ? 1:0
3)輸入技巧:輸入為連續的八位數來表示日期,使用 %4d讀取前四位,使用 %2d%2d讀取其它後四位。省去了字串處理。
scanf("%4d%2d%2d",&d.year,&d.month,&d.day);
4)由於需要計算輸入時間與規定的原點時間(規定為0年0月0日)之間相差的天數,計算量較大,因此考慮對資料採用預處理的方式:
「在程式真正開始處理輸入資料之前,預處理出所有日期與原點日期之間的天數差並儲存起來。當資料真正開始輸入時,只需要用0 (1) 的時間複雜度將儲存的資料讀出,稍加處理便能得到答案。」
假定我們計算2023年12月31日之前的所有日期與原點日期之間的天數差,使用buf[5001][13][32]
三維陣列儲存計算結果。這樣就可以直接使用下標buf[year][month][day]
得到year年month月day日與原點日期之間的天數差。
在「4)」中,有以下幾點需要注意:
採用預處理是空間換時間的重要手段(儲存預處理所得資料所需的記憶體來換取實時處理所需要的時間消耗),酌情使用。
buf[5001][13][32]
這個陣列比較耗費記憶體,因此需在函式體外定義,即定義成全域性變數,或在函式中使用malloc等函式動態申請變數空間。
這種方法的乙個缺點是,當輸入日期為2023年的某一天時,將不能得出正確結果。
由於需要耗費大量的記憶體,若在main函式(其它函式也一樣(之中定義該陣列,其函式所可以使用的棧空間將不足以提供如此龐大的記憶體,出現棧溢位,導致程式異常終止。所以,凡是涉及此類需要開闢大量記憶體空間的情況,都必須參照以上方法。
3、思路
考察了日期類問題中最基本的問題——求分別以兩個特定日期為界的日期區間的長度。解決這類區間問題有乙個統一的思想:把原區間問題統一到起點確定的區間問題上。
在該例中,把問題統一到特定日期與乙個原點時間的天數差,當要求兩個特定的日期之間的天數差時,只要將它們與原點日期的天數差相減,便能得到這兩個特定日期之間的天數差(必要時加絕對值)。
4、**
#include
#include
#include
using
namespace std;
struct date};
intmonth
(int i)
}int
caldays
(date *d)if(
(d->year %4==
0&& d-
>year %
100!=0)
|| d-
>year %
400==0)
}//日
days +
= d-
>day;
return days;
}int
main()
#include
#include
#include
using
namespace std;
#define isyeap(x) x%100!=0 && x%4==0 || x%400==0 ? 1:0
int buf[
5001][
13][32
];intdayofmonth
(int i,
int isyeap)
return28;
case3:
return31;
case4:
return30;
case5:
return31;
case6:
return30;
case7:
return31;
case8:
return31;
case9:
return30;
case10:
return31;
case11:
return30;
case12:
return31;
}}struct date
void
nextday()
}}};
intmain()
scanf
("%4d%2d%2d"
,&d1.year,
&d1.month,
&d1.day)
;scanf
("%4d%2d%2d"
,&d2.year,
&d2.month,
&d2.day)
;printf
("%d\n"
,abs
(buf[d1.year]
[d1.month]
[d1.day]
-buf[d2.year]
[d2.month]
[d2.day]))
+1;return0;
}
二、day of week
1、題目和要求
時間限制:1s,記憶體限制:32mb,特殊判題:否
2、總結
(4 + abs(caldays(&d1) - caldays(&d2)))%7
還可以寫成((4 + caldays(&d1) - caldays(&d2))%7 + 7)%7
3、思路
按照上面例題的解題思路:知道今天星期幾,知道今天和輸入天數相差幾天。根據星期以7天為一週期,從而求得輸入日期是星期幾。
4、**
#include
#include
#include
using
namespace std;
struct date};
intmonth
(int i)
}int
caldays
(date *d)if(
(d->year %4==
0&& d-
>year %
100!=0)
|| d-
>year %
400==0)
}//日
days +
= d-
>day;
return days;
}int
main()
return0;
}
1 2 日期函式
1.2 日期函式select sysdate from dual 顯示的日期格式是系統預設格式 select to char sysdate,yyyy mon dd hh24 mi ss systime from dual 用途 使用者註冊時間的插入 insert into user table n...
日期類問題 例2 1日期差值
此類問題解題思路 定乙個錨點日期,如0年1月1日,先算出往後多少年內每一日子距離這個錨點的天數,例如要算兩個日期間天數時,便可以將兩個日期距離錨點日期之間的天數相減,即可得到。題目描述 有兩個日期,求兩個日期之間的天數,如果兩個日期是連續的我們規定他們之間的天數為兩天 輸入 有多組資料,每組資料有兩...
12專案四。日期時間類
程式 專案4 日期時間類 定義乙個日期類date,資料成員包括年 月 日,setdate int y,int m,int d 和printdate 函式分別用於設定日期和顯示日期 再定義乙個時間類time,資料成員包括時 分 秒,settime int h,int m,int s 和printtim...