NowCoder在淘宝上开了一家网店。他发现在月份为素数的时候,当月每天能赚1元;否则每天能赚2元。现在给你一段时间区间,请你帮他计算总收益有多少。
链接:https://www.nowcoder.com/questionTerminal/754921e9c98b43d1b2d70c227b844101
来源:牛客网
输入描述:
输入包含多组数据。
每组数据包含两个日期from和to (2000-01-01 ≤ from ≤ to ≤ 2999-12-31)。
日期用三个正整数表示,用空格隔开:year month day。
输出描述:
对应每一组数据,输出在给定的日期范围(包含开始和结束日期)内能赚多少钱。
示例1
输入
2000 1 1 2000 1 31
2000 2 1 2000 2 29
输出
62
29
刚见到这个题时,也是感觉很蒙,后来仔细一想,有了思路,就是日期计算器的变种。
1.我们把2,3,5,7,11月里每天算一天,而其余7个月每天算两天。
2.然后再一个计算日期是该年的第几天,和一个完整的整年函数。
3.进而如果两个年份再同一年,则只需运用后面那个在该年的天数-前面那个在该年的天数 即可的。
3当两个年份不在同一年的时候,则需要让第一个完整的整年天数减去在该年的的几天,然后加上后面那年是第几天,然后再加上中间的整年天数。
#include<iostream>
#include<vector>
using namespace std;
int isPrim(int year) { //是闰年就+1,多一天
if (year % 400 == 0 || (year % 4 == 0 && year % 100 != 0)) {
return 1;
}
else {
return 0;
}
}
//每一年的天数
int wan_year_day(int year) {
int total = 0;
total = 31 * 2 +1* 28 +1*31 + 30 * 2 +1* 31 + 30 * 2 + 31
+ 31 * 2 + 30 * 2 + 31 * 2 + 30 + 31 * 2 + isPrim(year);
return total;
}
int isMonth(int month) {
if (month == 2 || month == 3 || month == 5 || month == 7 || month == 11) {
return 1;
}
else {
return 2;
}
//判断是否是素月
}
//计算该日期在本年的第几天
int day_of_year(int year, int month, int day) {
int months[12] = { 62,28,31,60,31,60,31,62,60,62,30,62 };
int total = 0;
for (int i = 0; i < month - 1; i++) {
total += months[i];
}
if (isMonth(month) == 2) {
total += day*2;
}
else {
total += day;
}
if (month > 2) {
total += isPrim(year);
}
return total;
}
int main()
{
int year1, month1, day1, year2, month2, day2;
int count_profit = 0;
cout << wan_year_day(1999);
while (cin >> year1 >> month1 >> day1 >> year2 >> month2 >> day2) {
count_profit = 0;
//同一年,直接相减,但是要注意后面的day-1 是需要的,
if (year1 == year2) {
count_profit = day_of_year(year2, month2, day2) - day_of_year(year1, month1, day1-1) ;
cout << count_profit << endl;
continue;
}
else
{
count_profit = wan_year_day(year1) - day_of_year(year1, month1, day1-1) ;
for (int i = year1 + 1; i < year2; i++) {
count_profit += wan_year_day(i);
} //加上整年天数
count_profit += day_of_year(year2, month2, day2);
cout << count_profit << endl;
continue;
}
}
system("pause");
return 0;
}