问题描述
NowCoder在淘宝上开了一家网店。他发现在月份为素数的时候,当月每天能赚1元;否则每天能赚2元。
现在给你一段时间区间,请你帮他计算总收益有多少。
输入描述
输入包含多组数据。
每组数据包含两个日期from和to (2000-01-01 ≤ from ≤ to ≤ 2999-12-31)。
日期用三个正整数表示,用空格隔开:year month day。
输出描述
对应每一组数据,输出在给定的日期范围(包含开始和结束日期)内能赚多少钱。
题目链接:淘宝网店
思路分析
首先关于该问题的输入,主要有这样几种情况:
- 起始年份与结束年份在同一年,仅计算相隔的日期数即可;
- 起始年份与结束年份不在同一年,需要计算起始年份剩下的日期得到的收益、结束年份与起始年份之间的每一年全年的收益、结束年份至今的收益三部分;
另外还要注意几个特殊点:
- 当遇到闰年时,2月需要多加一天;
- 收益包括起始日期和结束日期当天的收益;
所以,这个问题实际就分成了几个部分,即几个方法,
- 闰年的判断;
- 素数月份的查找;
- 收益计算;
下面是具体的代码实现:
代码实现
import java.util.Scanner;
public class Main {
//判断是否为闰年
private static boolean isLeapYear(int year){
return year%400==0||(year%4==0&&year%100!=0);
}
//计算某一年全年的收益,如果是闰年,需要多加一天
private static int profitYear(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+
(isLeapYear(Year)?1:0);
}
//查询月份是否为素数月份;
private static boolean isPrime(int month){
return month==2||month==3||month==5||month==7||month==11;
}
private static int profitOfYear(int year,int month,int day){
int profit=0;
//素数月份每天的收益为1,非素数月份每天的收益为2
if(!isPrime(month)){
profit=day*2;
}else{
profit=day;
}
//循环计算每个月的收益
while (--month>0){
switch (month){
case 1:
case 8:
case 10:
case 12:
profit+=(2*31);
break;
case 4:
case 6:
case 9:
profit+=(2*30);
break;
case 3:
case 5:
case 7:
profit+=(1*31);
break;
case 11:
profit+=30;
break;
case 2:
profit+=28+(isLeapYear(year)?1:0);
break;
}
}
return profit;
}
public static void main(String[] args) {
int year1,month1,day1;
int year2,month2,day2;
int profit=0;
Scanner scanner=new Scanner(System.in);
while (scanner.hasNextInt()){
year1=scanner.nextInt();
month1=scanner.nextInt();
day1=scanner.nextInt();
year2=scanner.nextInt();
month2=scanner.nextInt();
day2=scanner.nextInt();
//起始年份到下一年剩下的收益
profit=profitYear(year1)-profitOfYear(year1,month1,day1-1);
//结束年份的收益
profit+=profitOfYear(year2,month2,day2);
//如果起始年份与结束年份是同一年,需要减去多余计算的一整年的收益
if (year1==year2){
profit-=profitYear(year1);
}
//起始年份与结束年份不是同一年,循环计算起始年份与结束年份之间每一年的收益
for (int i=year1+1;i<year2;i++){
profit+=profitYear(i);
}
System.out.println(profit);
}
}
}
over!