每日一题4.8.1

每日一题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;
}

参考答案:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/lxb18821659801/article/details/89304186
今日推荐