目录
牛客_淘宝网店(日期模拟)
解析代码
牛客_淘宝网店(日期模拟)
淘宝网店__牛客网
解析代码
这是一个变相的日期计算器。只不过2、3、5、7、11月算1天,其他7个月算2天。
既然是一个变相的日期计算器,那就写一个日期计算器,然后加以修改即可。那么,日期计算器怎么写呢?日期计算器的话,可以把日期计算分为三个部分:
- 第一个不足一年的年份,最后一个不足一年的年份,和中间的足年年份。
- 足年年份我们只需要判断闰年后加365或366就行了。
- 不足年,我们就要求出这个日期是这一年的第几天。假设要求的是1994年5月27日到2003年4月29日,那么,我们就要先求出5月27日是这一年的第几天,然后判断1994年不是闰年,不是,所以用365减去这个天数,就得到结果了。本题中第一天也要算,所以还要加上这一天。然后再算出4月29日是2003年的第几天,就可以解决问题了。所以需要一个函数,功能是给出一个年月日,求出这是这一年的第几天。
这些功能全部实现后,再去改造使得1、4、6、8、9、10、12月的天数翻倍,那么程序就全部完成了。
#include <iostream>
#include <cstdio>
#include <cmath>
using namespace std;
// // 月份为素数的时候,当月每天能赚1元;否则每天能赚2元
// int arr[13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
//闰年判断函数
inline int leap_year(int year)
{return year % 400 == 0 || (year % 4 == 0 && year % 100 != 0);
}
//足年天数
inline int profit_of_year(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+ leap_year(year);
}
//判断这个月份是不是质数月
inline bool prime(int n)
{return n == 2 || n == 3 || n == 5 || n == 7 || n == 11;
}
//求出一个日子是这一年的第几天
int profit_of_this_year(int year, int month, int day)
{if (!prime(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 + leap_year(year);break;default:;}}return day;
}
int main()
{int year1, month1, day1, year2, month2, day2;int count_profit = 0;while (std::cin >> year1 >> month1 >> day1 >> year2 >> month2 >> day2){count_profit = 0;count_profit += profit_of_year(year1) -profit_of_this_year(year1, month1, day1 - 1);
//这里的day1 - 1虽然有可能会出现0日,但是实际2月0日就相当于1月31日,所以不影响结果。count_profit += profit_of_this_year(year2, month2, day2);if (year1 == year2) // 避免起点和终点是同一年,如果是同一年,要减掉这一年的天数。{count_profit -= profit_of_year(year1);}for (int i = year1 + 1; i < year2; i++) //中间足年每一年的天数{count_profit += profit_of_year(i);}std::cout << count_profit << std::endl;}return 0;
}