已知 2011 年 11 月 11 日是星期五,問 yyy
yyyyy
yyyy
年 mm
mmmm
月 dd
dddd
日是星期幾?注意考慮閏年的情況。尤其是逢百年不閏,逢 400 年閏的情況。
input
輸入只有一行 yyyy mm dd
output
輸出只有一行 w
input
2011 11 11
output
5note
1599≤y
yyy≤
2999
1599 \le yyyy \le 2999
1599≤y
yyy≤
2999
1 ≤m
m≤
121 \le mm \le 12
1≤mm≤121≤
dd≤31
1 \le dd \le 31
1≤dd≤3
1,且確保測試樣例中 yyyy 年 mm 月 dd 日是乙個合理日期
1 ≤w
≤7
1 \le w \le 7
1≤w≤
7,分別代表周一到週日
做題過程:
做完直接瘋了……這種日期的題目太折磨人了,&
&\&\&
&&寫成 ∣∣||
∣∣找了一晚上bug。
解題方法就是求出兩個日期之間的天數差。嘗試了幾種求天數的方法,下面這種我覺得最簡單,假設兩個時間點為 a
aa 和 b
bb 並且 a≤b
a\le b
a≤b,記 a
aa 那一年已經過去的天數為 a
aa,b
bb 那一年還沒過的天數為 b
bb,a
aa 年到 b
bb 年的總天數(包括a
aa 那年和 b
bb 那年)為 sum
sumsu
m,所以 天數差 ans
=sum
−a−b
ans=sum-a-b
ans=su
m−a−
b 至於換成星期幾,題目給出的日期在2011.11.11之前和在2011.11.11之後的計算方法是不一樣的,簡單的方法是記下乙個週期 t
tt ,模 7
77 之後直接作為下標輸出 t[a
ns%7
]t[ans\%7]
t[ans%
7]。日期大
:t1[
7]=;
日期大: t_1[7] = \;
日期大:t1
[7]
=;日 期小
:t2[
7]=;
日期小:t2[7] = \;
日期小:t2
[7]=
;code:
#include
#define io ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
using
namespace std;
typedef
long
long ll;
struct node};
int mon[13]
=;bool
judge
(int y)
//判斷閏年
intmain()
int sum1 =
0, sum2 =0;
for(
int i = a.y; i <= b.y; i++
)for
(int i =
1; i < a.m; i++
) sum2 +
= a.d;
for(
int i = b.m; i <=
12; i++
) sum2 -
= b.d;
int ans = sum1 - sum2;
ans %=7
;int t1[7]
=;int t2[7]
=;//這種方式比較好理解
if(flag)
//flag是true表示輸入的日期大
cout << t1[ans]
<< endl;
else
cout << t2[ans]
<< endl;
//下面這種方式也行
// if (flag)
// cout << (ans + 4) % 7 + 1 << endl;
// else
// cout << 7 - ((ans + 2) % 7) << endl;
return0;
}
藍橋杯 日期計算
演算法提高 日期計算 時間限制 1.0s 記憶體限制 256.0mb 問題描述 已知2011年11月11日是星期五,問yyyy年mm月dd日是星期幾?注意考慮閏年的情況。尤其是逢百年不閏,逢400年閏的情況。輸入格式 輸入只有一行 yyyy mm dd 輸出格式 輸出只有一行 w 資料規模和約定 1...
藍橋杯 日期計算
問題描述 已知2011年11月11日是星期五,問yyyy年mm月dd日是星期幾?注意考慮閏年的情況。尤其是逢百年不閏,逢400年閏的情況。輸入格式 輸入只有一行 yyyy mm dd 輸出格式 輸出只有一行 w樣例輸入 2011 11 11 樣例輸出 資料規模和約定 1599 yyyy 2999 1...
計蒜客 藍橋杯模擬賽5 B組 部分題解
傳送門 d 快速冪,理解到原理,然後寫個2,2判斷下應該怎麼走即可 ans int res pw x,y 1,p pw x,y 1,p p e 因為產生0的原因只能值2 和 5的結合,有乙個結合就會多乙個零,但是我們可以注意到2的數量比5的多很多,所以直接數n 的階乘會產生多少個5即可 ans an...