日期算法
题一:一周中的第几天
思路:
创建一个月份数组,和两份月中日期数组分别为平闰年;
创建一个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;
}