编程题——淘宝网店

链接:https://www.nowcoder.com/questionTerminal/754921e9c98b43d1b2d70c227b844101
来源:牛客网

NowCoder在淘宝上开了一家网店。他发现在月份为素数的时候,当月每天能赚1元;否则每天能赚2元。
现在给你一段时间区间,请你帮他计算总收益有多少。

输入描述:

输入包含多组数据。
每组数据包含两个日期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

**解题思路:**收益分成三部分:起始年份当年剩余的收益+ 整年的收益+末年的收益

#include
#include

using namespace std;

//判断闰年
int leap_year(int year)
{
    return (year%400 == 0) || ((year%4== 0)&&(year%100!=0));
}

//整年年份收益
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);  //如果当前年份是闰年,则还要+1
        
}

//判断月份是否是素数
bool prime(int month)
{
    return month==2 || month==3 || month==5 || month==7 || month==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:break;
        }
    }
    return day;
}

int main()
{
    int year1,month1,day1,year2,month2,day2;
    while(cin>>year1>>month1>>day1>>year2>>month2>>day2)
    {
        int profit = 0;
        //起始年剩余天数的收益
        profit += profit_of_year(year1) - profit_of_this_year(year1, month1, day1-1);
        //day-1:实际是求起始年剩余天数包括当天,要减去当天之前的收益
        //day-1:虽然有可能会出现0日,但是实际2月0日就相当于1月31日,所以不影响结果
        
        //末尾年当年的收益
        profit += profit_of_this_year(year2, month2, day2);
        
        //若是同一年,要减去这一年开始的收益
        if(year1 == year2)
        {
            profit -= profit_of_year(year1);
        }
        
        
        //整年收益
        for(int i = year1 + 1; i < year2; i++)
        {
            profit +=profit_of_year(i);
        }
        
        cout << profit << endl;
    }
    return 0;
}

你可能感兴趣的:(编程题,c++,算法,c语言)