Hero算法练习

该博客介绍了如何用C++实现日期相关的算法,包括计算一周中的第几天、一年中的第几天以及两个日期之间的间隔天数。通过创建月份和日期数组,结合闰年的判断,计算出日期与1971年1月1日之间的天数差,并返回对应的星期和一年中的天数。此外,还提供了计算日期间隔的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

日期算法

题一:一周中的第几天

在这里插入图片描述

思路:

创建一个月份数组,和两份月中日期数组分别为平闰年;

创建一个string 数组存储星期数;

已知有效日期为1971年开始。查询到1971年1月1号,是周五,而且周循环为7.

那么找到当前日期距离1971年1月1号有多少天,用着天数除去7,查看余数。

#include<iostream>
#include<string>
using namespace std;
string func(int day,int month,int year)
{
     string week[7] = { "Friday","Saturday","Sunday","Monday","Tuesday","Wednesday","Thursday" };
	int m[13] = { 0,1,2,3,4,5,6,7,8,9,10,11,12 };
	int day01[13] = { 0,31,28,31,30,31,30,31,31,30,31,30,31 };
	int day02[13] = { 0,31,29,31,30,31,30,31,31,30,31,30,31 };
	int sum = day-1;
	for (int i = 1971; i < year; i++)
	{
		if (i % 4 == 0 && i % 100 != 0 || i % 400 == 0)
		{
			sum += 366;
		}
		else 
		{ 
			sum += 365;
		}
	}
	if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0)
	{
		for (int i = 1; i <m[month]; i++)
		{
			sum += day02[i];
		}
	}
	else
	{
		for (int i = 0; i < m[month]; i++)
		{
			sum += day01[i];
		}
	}
	int weekday = sum % 7;
	return week[weekday];
}

题二:一年中的第几天;

在这里插入图片描述

思路:

1.将string数据转换为int类型; 利用stoi()函数和string子串截取;

2.创建一个月份数组,和两份月中日期数组分别为平闰年;

3.判断当前年份的润平来确认当前使用哪个月份的日期;

#include<iostream>
#include<string>
using namespace std;
int dayOfYear(string date) {
    int m[13] = { 0,1,2,3,4,5,6,7,8,9,10,11,12 };
    int day01[13] = { 0,31,28,31,30,31,30,31,31,30,31,30,31 };
    int day02[13] = { 0,31,29,31,30,31,30,31,31,30,31,30,31 };

    int year = stoi(date.substr(0.4));
	int month = stoi(date.substr(5, 2));
	int day = stoi(date.substr(8, 2));
	int sum = day;
	
	if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0)
		{
			for (int i = 1; i < m[month]; i++)
			{
				sum += day02[i];
			}
		}
	else
		{
			for (int i = 0; i < m[month]; i++)
			{
				sum += day01[i];
			}
		}
	return sum;
    }

题三:日期间隔了几天;

在这里插入图片描述

思路:

1.以1971年1月1日为标准计算计算每个日期与它之间的差值;

2.将两个差值做减法;

3,偷个懒代码从题一中拷贝的;

int daysBetweenDates(string date1, string date2) {
    int m[13] = { 0,1,2,3,4,5,6,7,8,9,10,11,12 };
    int day01[13] = { 0,31,28,31,30,31,30,31,31,30,31,30,31 };
    int day02[13] = { 0,31,29,31,30,31,30,31,31,30,31,30,31 };
    int year1 = stoi(date1.substr(0.4));
	int month1 = stoi(date1.substr(5, 2));
	int day1 = stoi(date1.substr(8, 2));
	int year2 = stoi(date2.substr(0.4));
	int month2 = stoi(date2.substr(5, 2));
	int day2 = stoi(date2.substr(8, 2));
	int sum1 = day1 - 1;
	int sum2 = day2 - 1;

	for (int i = 1971; i < year1; i++)
	{
		if (i % 4 == 0 && i % 100 != 0 || i % 400 == 0)
		{
			sum1 += 366;
		}
		else
		{
			sum1 += 365;
		}
	}
	if (year1 % 4 == 0 && year1 % 100 != 0 || year1 % 400 == 0)
	{
		for (int i = 1; i < m[month1]; i++)
		{
			sum1 += day02[i];
		}
	}
	else
	{
		for (int i = 0; i < m[month1]; i++)
		{
			sum1 += day01[i];
		}
	}
	for (int i = 1971; i < year2; i++)
	{
		if (i % 4 == 0 && i % 100 != 0 || i % 400 == 0)
		{
			sum2 += 366;
		}
		else
		{
			sum2 += 365;
		}
	}
	if (year2 % 4 == 0 && year2 % 100 != 0 || year2% 400 == 0)
	{
		for (int i = 1; i < m[month2]; i++)
		{
			sum2 += day02[i];
		}
	}
	else
	{
		for (int i = 0; i < m[month2]; i++)
		{
			sum2 += day01[i];
		}
	}
	if (sum2 >= sum1) return sum2 - sum1;
	else return sum1 - sum2;
    }

int sum2 = day2 - 1;

for (int i = 1971; i < year1; i++)
{
	if (i % 4 == 0 && i % 100 != 0 || i % 400 == 0)
	{
		sum1 += 366;
	}
	else
	{
		sum1 += 365;
	}
}
if (year1 % 4 == 0 && year1 % 100 != 0 || year1 % 400 == 0)
{
	for (int i = 1; i < m[month1]; i++)
	{
		sum1 += day02[i];
	}
}
else
{
	for (int i = 0; i < m[month1]; i++)
	{
		sum1 += day01[i];
	}
}
for (int i = 1971; i < year2; i++)
{
	if (i % 4 == 0 && i % 100 != 0 || i % 400 == 0)
	{
		sum2 += 366;
	}
	else
	{
		sum2 += 365;
	}
}
if (year2 % 4 == 0 && year2 % 100 != 0 || year2% 400 == 0)
{
	for (int i = 1; i < m[month2]; i++)
	{
		sum2 += day02[i];
	}
}
else
{
	for (int i = 0; i < m[month2]; i++)
	{
		sum2 += day01[i];
	}
}
if (sum2 >= sum1) return sum2 - sum1;
else return sum1 - sum2;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值