枚举和模拟 下 习题
01 今年的第几天?
描述
输入年、月、日,计算该天是本年的第几天。
输入描述
包括三个整数年(1<=Y<=3000)、月(1<=M<=12)、日(1<=D<=31)。
输出描述
输入可能有多组测试数据,对于每一组测试数据, 输出一个整数,代表Input中的年、月、日对应本年的第几天。
示例1
输入:
1990 9 20
2000 5 1
输出:
263
122
解答
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
using namespace std;
//求当前天数的下一天的年月日
void NextDay(int &year, int &month, int &day) {
int dayOfMonth[] = { 0,31,28,31,30,31,30,31,31,30,31,30,31 };
//给一个年份 判断是不是闰年
//1 可以被100整除 也可以被400整除 是闰年
//2 不能被100整除 但是可以被4整除 是闰年
//判断是不是闰年
if (year % 400 == 0 || year % 4 == 0 && year % 100 != 0) {
//此处 逻辑&&的优先级高于逻辑||
dayOfMonth[2] = 29;
}
else {
dayOfMonth[2] = 28;
}
day++;
//看加完以后的天数 有没有超过这个月的上限值
if (day > dayOfMonth[month]) {
day = 1;//日回归到1
month++;//月份往后走了一个月
}
//看加完以后的月数 有没有超过月份的上限值
if (month > 12) {
month = 1;
year++;
}
}
int main() {
int year, month, day;
while (scanf("%d %d %d", &year, &month, &day) != EOF) {
int next = 1;//NextDay执行次数
int curmonth = 1;
int curday = 1;
while (1) {
if (month == curmonth && day == curday) {
break;
}
NextDay(year, curmonth, curday);
next++;
}
printf("%d", next);
}
return 0;
}