[每日一题] 63. 淘宝网店(日期计算)

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 

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;
}

你可能感兴趣的:(每日一题,算法编程题,日期计算)