藍橋杯VIP——黑色星期五
阿新 • • 發佈:2018-12-06
1.問題描述
2.演算法分析
典型的日期計算,其實就是列舉思想,首先我們確定從1998.1.1日週四開始列舉,然後判斷該年是否為閏年,再去判斷當星期數為8時我們需要將星期數重置為星期1開始,當每天的天數等於月末+1天時重置天數為下個月1號,當月份為13時跳出迴圈,年份+1,再依次迴圈。最後輸出即可。
提示:
這裡有幾個坑:首先你判斷月末和星期數都要+1而不是星期7就變為1,而且月末+1天也是個坑
然後需要注意的是,一開始迴圈我們不應該先將天數和星期數++,而是在後面進行++
應該先判斷是否是黑色星期五在判斷星期數,在判斷月份是否到年末了。
3.原始碼:
#include <iostream>
#include <cstdio>
using namespace std;
int m[13] = {0,31,28,31,30,31,30,31,31,30,31,30,31};//儲存每一個月的天數
int main(){
int year;
scanf("%d", &year);
int y = 1998;
int d = 1; //1998.1.1
int month = 1; //1月份
int w = 4; //週四
int cnt = 0; //記錄每一年的既是13號又是週五的天數
while(y <= year){
// cnt = 0; //記錄每一年的既是13號又是週五的天數
if (y % 400 == 0 || (y % 100 != 0 && y % 4 == 0)){
m[2] = 29;
} else{
m[2] = 28;
}
while(1){
if (d == 13 && w == 5 && y == year){
cnt++;
}
if (w == 8){
w = 1;
}
if (d == m[month] + 1){
month++;
d = 1 ;
}
if (month == 13){
d = 1;
month = 1;
break;
}
d++;
w++;
}
y++;
}
printf("%d\n", cnt);
return 0;
}
可以關注一下Blog:http://47.107.118.184