一. 需要用到的相关知识
1. 日期类实现
主要是通过operator++()来计算两个日期之间相差的天数。具体实现看下面这篇博客:日期类模拟实现。
2. 蔡勒公式
作用是通过输入的年月日算出今天是周几。
公式:W=[C/4]-2C+y+[y/4]+[26(m+1)/10]+d-1 (其中[ ]为取整符号)
- W是所求日期的星期数;
- 如果求得的数大于7,可以直接对7取余,不过周日就输出为0了。
- 如果求得的数小于0,可以加上7的倍数,直到结果大于零小于7为止。
- c是公元年份的前两位数字;
- y是已知公元年份的后两位数字;
- m是月数,所求的月份如果是1月或2月,则应视为前一年的13月或14月.
所以公式中m 的取值范围不是1-12,而是3-14。 - d是日数;
- 方括[ ]表示只截取该数的整数部分;
模板代码:
int GetWeek(int year, int month, int day)
{
if(month == 1 || month == 2)
{
--year;
month += 12;
}
int century = year / 100;
year %= 100;
int week = year + (year / 4) + (century / 4) - 2 * century + 26 * (month + 1) / 10 + day - 1;
// 同时处理了负数或大于7的情况
week = (week % 7 + 7) % 7;
if (week == 0)
{
week = 7;
}
return week;
}
二. 日期类题目
1、淘宝网店
题目描述:
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
解题思路:设计日期类,通过日期类的operator++()统计给定时间区间内每一天的收益,注意判断当月是否为2月的闰年。
完整代码:
#include <vector>
#include <iostream>
using namespace std;
bool IsPrime(int num)
{
if(num <= 1)
{
return false;
}
for(int i = 2; i*i <= num; ++i)
{
if(num%i == 0)
{
return false;
}
}
return true;
}
class Date
{
public:
// 传入年、月、日构造一个日期类对象
Date(int year, int month, int day)
:_year(year)
,_month(month)
,_day(day)
{
}
// <运算符重载
bool operator<(const Date& d) const
{
if(_year < d._year)
{
return true;
}
else if(_year == d._year && _month < d._month)
{
return true;
}
else if(_year == d._year && _month == d._month && _day < d._day)
{
return true;
}
return false;
}
// ==运算符重载
bool operator==(const Date& d) const
{