计算从y1到y2年a月的第b个星期c的日期
#include<iostream> using namespace std; bool isLeap(int y) { if(y%400==0 || y%4==0&&y%100!=0) return true; return false; } int main() { int a,b,c; int y1,y2; int pre_ydays = 0; // int pre_mdays = 0; int week = 0; int b1 = 0;//用于计数,第b1个星期c int day = 1;//用于记录当前是是第a月的第几天 int months[13]= {0,31,28,31,30,31,30,31,31,30,31,30,31};//每个月的天数 cin>>a>>b>>c>>y1>>y2; if(c == 7) //因为7%7 =0 c = 0; for(int i=1850;i<y1;i++) //计算从1850年到y1年之前共有多少天 { if(isLeap(i)) pre_ydays += 366; else pre_ydays += 365; } week = (pre_ydays+2) % 7;//计算y1年1月1号是星期几,因为1850年1月1号是星期二,所以要加2 for(int y = y1;y<=y2;y++)//从y1年到y2年遍历 { //如果是闰年2月份是29天 if(isLeap(y)) months[2] = 29; for(int m=1;m<a;m++) { pre_mdays += months[m];//记录从y年1月1号到a月1号之前有多少天 } week = (pre_mdays + week)%7; //计算呢a月1号是星期几 b1 = 0;//用于记录第b1个星期c,初始化为0 day = 1;//记录到第几天了 for(int d = 1;d<=months[a]; d++) { if(week == c)//是星期c { b1 ++; } if(week==c && b1==b)//是当前日期 break; day++; week = (week+1)%7; } printf("%4d/%02d/%02d\n",y,a,day); //为计算下一年做准备 pre_ydays = pre_ydays+365; if(isLeap(y)) { pre_ydays += 1; months[2] = 28; } week = (pre_ydays +2)%7; pre_mdays = 0; } return 0; }