zl程序教程

您现在的位置是:首页 >  IT要闻

当前栏目

算法0基础刷题——日期计算

2023-02-18 16:26:27 时间

准备知识

刷完今天的题目,我感觉有以下需要掌握的知识

  1. 提取字符串 由于日期存储是一个字符串的形式,所以说要先提取年,月,日。 下面我们来说几个string的函数 s.substr(pos, n) //截取s中从pos开始(包括0)的n个字符的子串,并返回 用这个来截取年,月,日
  2. 返回字符串长度 s.size()或s.length(),返回无符号类型的数为字符串长度

解题报告

一周中的第几天

暴力解题:

    int days = 0,ret=0;
	switch (month)//以闰年举例
	{
	case 12:days += 30;
	case 11:days += 31;
	case 10:days += 30;
	case 9:days += 31;
	case 8:days += 31;
	case 7:days += 30;
	case 6:days += 31;
	case 5:days += 30;
	case 4:days += 31;
	case 3:days += 29;
	case 2:days += 31;
	default:break;
	}
	if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0)
	{
		days += day;
	}
	else//如果为平年且输入的月份大于2,则算出的天数需要减1
	{
			if (month > 2)
			{
				days--;
			}
		days += day;
	}
	days--;//计算与1971年1月1日的距离天数时,假设计算日期为1971年1月1日,间隔的天数应为1-1=0天,由此所得days-1才是正确解
	for (int i = 1971; i < year; i++)//计算1971年到year前一年经历的总天数
	{
		if (i % 4 == 0 && i % 100 != 0 || i % 400 == 0)
		{
			days += 366;
		}
		else
		{
			days += 365;
		}
	}
	ret = days % 7;//计算所求日期与初始日期的差值
	switch (ret)
	{
	case 0: return "Friday"; break;
	case 1: return "Saturday"; break;
	case 2: return "Sunday"; break;
	case 3: return "Monday"; break;
	case 4: return "Tuesday"; break;
	case 5: return "Wednesday"; break;
	case 6: return "Thursday"; break;
	}

一年中的第几天

#include<iostream>
#include<string>
using namespace std;
int main()
{
	string d;
	cin >> d;
	int year = stoi(d.substr(0, 4));//截取年,月,日
	int month = stoi(d.substr(5, 2));
	int day = stoi(d.substr(8, 2));
	int months[12] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
	int res = 0;
	if ((year % 400 == 0) || ((year % 4 == 0) && year%100))
	{
		months[1] = 29;
	}

	for (int i = 1; i < month; ++i)
	{
		res += months[i - 1];
	}
	// cout << res << " " << day << endl;
	res += day;
	cout << res;
	return 0;
}

间隔天数 要求返回某年某日与某年某日的间隔天数,和上面的类似,多加了年份天数的计算。 坑:计算日子的差值要用到绝对值

public:
    int daysBetweenDates(string date1, string date2) {
        // 坑: 这里是绝对值
        return abs(date2day(date1) - date2day(date2));//调用abs函数
    }