CCF計算機職業資格認證考試題解系列文章爲meelo原創,請務必以連接形式註明本文地址html
1.計算1年~y年有多少個閏年spa
2.計算y年a月1日離1年1月1日有多少天code
3.計算y年a月1日星期幾htm
4.計算y年a月第b個星期c離a月1日有多少天blog
5.判斷是否這一天是否存在get
計算的一個麻煩的地方是,人類是從1開始計數的,容易產生一些詭異的邊界狀況。下面的代碼中首先把輸入的數據轉換成了從0開始計數。io
C++class
#include <stdio.h> int daysOfMonth[12] = {31,28,31,30,31,30,31,31,30,31,30,31}; // y年是不是閏年 bool isLeap(int y) { return y%4==0 && y%100!=0 || y%400==0; } // 0001年到y年(包括)有多少個閏年 int numLeapYear(int y) { return y/4 - y/100 + y/400; } // y/m/d離0001/01/01有多少天 // 0001/01/01星期一 int numDays(int y, int m, int d) { int days = 365 * (y-1); days += numLeapYear(y-1); int i = 0; while(i < m) { days += daysOfMonth[i]; i++; } days += d; return days; } // y/m/d 星期幾 int weekday(int y, int m, int d) { int days = numDays(y, m, d); int weekd = 0; weekd = (weekd + days) % 7; return weekd; } int main() { int a, b, c, y1, y2; scanf("%d%d%d%d%d", &a, &b, &c, &y1, &y2); a--, b--, c--; // 月份,日期默認從0開始計數 for(int y=y1; y<=y2; y++) { if(isLeap(y)) month[1] = 29; else month[1] = 28; int weekd = weekday(y, a, 0); // y年a月1日星期幾 int day = (c-weekd+7)%7 + b*7; if(day>=daysOfMonth[a]) printf("none\n"); else printf("%04d/%02d/%02d\n", y, a+1, day+1); } }