链接: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<iostream>
#include<math.h>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;
}