poj3393(模拟)

题意:好长。。。给出一个时间段,问在这个时间段中,每个月第一个工作日为星期一(goodday)和最后一个工作日为星期五(luckyday)的数目各为多少。

思路:判断闰月后,不断加就好了,具体看程序。

#include<iostream>

using namespace std;
#define DAY ((day+5)%7)

int test, day, ys, ms, ye, me, good, lucky;
int month[12]={31,28,31,30,31,30,31,31,30,31,30,31};

bool leap(int i){
	if (i < 1582){
		if (i % 4 == 0) return true;
	}
	else{
		if (i == 1700){
			return true;
		}
		if (((i % 4 == 0) && (i % 100 != 0)) || (i % 400 == 0))
			return true;
	}
	return false;
}

int to_today(int ys, int ms){
	for (int i = 1; i < ys; i++){
		if (leap(i)) day+=366;
		else day+= 365;
		day %= 7;
	}

	if (ys > 1752) day = (day + 3)%7;
	for (int i = 1; i < ms; i++){
		day += month[i-1];
		if (leap(ys) && i == 2) day+=1;
		else if (ys == 1752 && i == 9) day-=11;
	}
	day %= 7;

	return day;
}

int main(){

	scanf("%d", &test);
	while(test--){
		day = 1;
		good = lucky = 0;
		scanf("%d%d%d%d",&ys,&ms,&ye,&me);
		day = to_today(ys, ms) % 7;

		int year = ys;
		for (int i = ms; i <= 12;){
			//cout << "firstDay: " <<DAY << endl;
			if (DAY < 2 || DAY == 6) good++;
			day += month[i-1];
			if (leap(year) && i == 2) day++;
			if (year == 1752 && i == 9) day -= 11;
			day %= 7;
			if (DAY == 6 || DAY < 2) lucky++;
			//cout << "lastDay: " << DAY << endl;
			if (i==me && year==ye) break;
			i++;
			if (i == 13){
				i = 1;
				year++;
			}
		}

		printf("%d %d\n", lucky, good);
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值