[每日一题] 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 <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;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Ypuyu

如果帮助到你,可以请作者喝水~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值