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); } }