1. 题目来源
链接:淘宝网店
来源:牛客网
2. 题目说明
NowCoder在淘宝上开了一家网店。他发现在月份为素数的时候,当月每天能赚1元;否则每天能赚2元。
现在给你一段时间区间,请你帮他计算总收益有多少。
输入描述:
输入包含多组数据。
每组数据包含两个日期from和to (2000-01-01 ≤ from ≤ to ≤ 2999-12-31)。
日期用三个正整数表示,用空格隔开:year month day。
输出描述:
对应每一组数据,输出在给定的日期范围(包含开始和结束日期)内能赚多少钱。
示例:
输入
2000 1 1 2000 1 31
2000 2 1 2000 2 29
输出
62
29
3. 题目解析
本题考查日期计算,只不过2、3、5、7、11月算一天,其它七月算两天。针对日期计算器,会将其分为三部分进行实现:
1)不足一年的年份
2)最后一年不足一年的年份
3)中间足年的年份。
足年年份只需判断平闰年区别365、366即可。针对情况一不足年年份需要求出该天是该年的第几天,在判断概念平闰情况,用365、366减去前天数即可。也顺便将情况三也解决了。函数实现即可。
4. 代码展示
// write your code here cpp
#include <bits/stdc++.h>
using namespace std;
// 闰年判断
int LeapYear(int year) {
return year % 400 == 0 || (year % 4 == 0 && year % 100 != 0);
}
// 足年天数
int FullYear(int year) {
return 2 * 31 + 1 * 28 + 1 * 31 + 2 * 30 + 1 * 31 + 2 * 30 + 1 * 31
+ 2 * 31 + 2 * 30 + 2 * 31 + 1 * 30 + 2 * 31 + LeapYear(year);
}
// 判断该月是否为素数月
bool PrimeMonth(int n) {
return n == 2 || n == 3 || n == 5 || n == 7 || n == 11;
}
// 求解当日为一年第几天
int DaysYear(int year, int month, int day) {
if (!PrimeMonth(month))
day *= 2;
while (-- month) {
switch(month) {
case 1:
case 8:
case 10:
case 12:
day += 62;
break;
case 3:
case 5:
case 7:
day += 31;
break;
case 4:
case 6:
case 9:
day += 60;
break;
case 11:
day += 30;
break;
case 2:
day += 28 + LeapYear(year);
break;
default:;
}
}
return day;
}
int main() {
int year1, month1, day1, year2, month2, day2;
int count = 0;
while (cin >> year1 >> month1 >> day1 >> year2 >> month2 >> day2) {
count = 0;
// 这里day1 - 1可能出现0日,但如2月0日即为1月31日,不影响结果
count += FullYear(year1) - DaysYear(year1, month1, day1 - 1);
count += DaysYear(year2, month2, day2);
if (year1 == year2)
count -= FullYear(year1);
for (int i = year1 + 1; i < year2; ++i)
count += FullYear(i);
cout << count << endl;
}
return 0;
}