每日一题4.8.1
淘宝网店
解题思路: 一道过程复杂,原理简单的题,我分为了三种情况,两个日期在同一年内;两个日期在相邻的两年内;两个日期相差两年以上,分别计算,还要判断月份是否为素数,该年是否为闰年,用一个二维数组存储平年与闰年每月的天数,最后计算总收益
代码实现:
#include <iostream>
#include <math.h>
using namespace std;
int months[2][13] = { { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 },
{ 0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 } };
int isleapyear(int year)
{
return (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0);
}
int isprime(int month)//判断月份是否为素数
{
if (month <= 1)
return -1;
for (int i = 2; i <= sqrt(month); i++)
{
if (month%i == 0)
return -1;
}
return 1;
}
int yearcount(int year)//平年或闰年整年的收益
{
int count;
if (isleapyear(year) == 1)
count = 2 * 31 + 29 + 31 + 30 * 2 + 31 + 30 * 2 + 31 + 31 * 2 + 30 * 2 + 31 * 2 + 30 + 31 * 2;
else
count = 2 * 31 + 28 + 31 + 30 * 2 + 31 + 30 * 2 + 31 + 31 * 2 + 30 * 2 + 31 * 2 + 30 + 31 * 2;
return count;
}
int sameyear(int year1, int month1, int month2, int day1, int day2)//两个日期在同一年的收益
{
int day;
int count = 0;
if (month1 == month2)//同一年同一月,只需计算天数
{
day = day2 - day1 + 1;
if (isprime(month1) == 1)
count = day;
else
count = day * 2;
return count;
}
for (int i = month1; i <= month2; i++)
{
if (i == month1)
day = months[isleapyear(year1)][i] - day1 + 1;
else if (i == month2)
day = day2;
else
day = months[isleapyear(year1)][i];
if (isprime(i) == 1)
count += day;
else
count += 2 * day;
}
return count;
}
int year2more1(int year1, int year2, int month1, int month2, int day1, int day2)//年份只差一年时
{
int day;
int count1 = 0, count2 = 0;
int count = 0;
for (int i = 1; i <= month2; i++)//year2从1月到month2的收益
{
if (i == month2)
day = day2;
else
day = months[isleapyear(year2)][i];
if (isprime(i) == 1)
count1 += day;
else
count1 += 2 * day;
}
for (int j = 12; j >= month1; j--)//year1从month1到年底的收益
{
if (j == month1)
day = months[isleapyear(year1)][j] - day1 + 1;
else
day = months[isleapyear(year1)][j];
if (isprime(j) == 1)
count2 += day;
else
count2 += 2 * day;
}
return count = count1 + count2;
}
int year2morethan1(int year1, int year2, int month1, int month2, int day1, int day2)//年份相差两年及以上时
{
int count = 0;
for (int i = year1 + 1; i <= year2 - 1; i++)
{
count += yearcount(i);
}
count += year2more1(year1, year2, month1, month2, day1, day2);
return count;
}
int main()
{
int year1, month1, day1;
int year2, month2, day2;
while (cin >> year1 >> month1 >> day1 >> year2 >> month2 >> day2)
{
if (year1 == year2)
{
cout << sameyear(year1, month1, month2, day1, day2) << endl;
}
if (year2 - year1 == 1)
{
cout << year2more1(year1, year2, month1, month2, day1, day2) << endl;
}
if (year2 - year1 > 1)
{
cout << year2morethan1(year1, year2, month1, month2, day1, day2) << endl;
}
}
return 0;
}
参考答案: