小蓝发现了一个神奇的闹钟, 从纪元时间(1970 年 1月 1日 00: 00: 00)开始, 每经过 x 分钟, 这个闹钟便会触发一次闹铃 (纪元时间也会响铃). 这引起了小蓝的兴趣, 他想要好好研究下这个闹钟.
对于给出的时间一个格式为 yyyy-MM-dd HH:mm:ss 的时间, 小蓝想要知道在这个时间点之前(包含这个时间点)最近的一次闹铃是什么时间?
注意,你不必考虑时区问题。
输入格式
输入的第一行包含一个整数 T , 表示每次输入包含 T 组数据.
接下来依次描述 T 组数据.
每组数据一行。包含一个时间(格式为 yyyy-MM-dd HH:mm:ss)和一个整数 x ,其中 x表示闹铃时间间隔(单位为分钟).
输出格式
输出 T 行. 每行包含一个时间(格式为 yyyy-MM-dd HH:mm:ss),依次表示每组数据的答案。

首先把从1970年到输入时间之间的秒数long long res算出来,再计算出可以触发闹铃的次数n= (res / (x * 60)) ,从而计算出从1970年开始到最后一次闹铃之间的秒数res= (res / (x*60)) * x * 60,再把这个秒数转化为题目要求的时间格式

#include<iostream>
#include<vector>
using namespace std;
long long gettimestamp(int a,int b,int c,int d,int e,int f)
{
int IsLeapYear=((a%4==0 && a%100!=0) || (a%400==0));
int MonthDay[12]={31,28+IsLeapYear,31,30,31,30,31,31,30,31,30,31};
long long res=0;
long long commonyear=365*24*60*60;
long long leapyear=366*24*60*60;
for(int i=1970;i<a;i++)
{
if((i%4==0 && i%100!=0) || (i%400==0))
res+=leapyear;
else
res+=commonyear;
}
for(int j=1;j<b;j++)
res+=MonthDay[j-1]*24*60*60;
for(int k=1;k<c;k++)
res+=24*60*60;
for(int l=1;l<=d;l++)
res+=60*60;
for(int m=1;m<=e;m++)
res+=60;
for(int n=1;n<=f;n++)
res+=1;
return res;
}

void PrintTime(long long res)
{
int year=1970;
while(true)
{
long long secyear=(365+((year%4==0 && year%100!=0) || (year%400==0)))*24*60*60;
if(res>=secyear)
{
year++;
res-=secyear;
}
else
break;
}
int MonthDay[12]={31,28+((year%4==0 && year%100!=0) || (year%400==0)),31,30,31,30,31,31,30,31,30,31};
int month=1,i=0;
while(true)
{
if(res>=MonthDay[i]*24*60*60)
{
res-=MonthDay[i]*24*60*60;
i++;
}
else
{
month+=i;
break;
}
}
int day=1,j=0;
while(true)
{
if(res>=24*60*60)
{
res-=24*60*60;
j++;
}
else
{
day+=j;
break;
}
}
int hour = res/3600; res%= 3600;
int minute = res/60; res%= 60;
int second = res;
printf("%04d-%02d-%02d %02d:%02d:%02d\n", year, month, day, hour, minute, second);
}

int main()
{
int T;
cin>>T;
for(int i=1;i<=T;i++)
{
int a,b,c,d,e,f,x;
scanf("%d-%d-%d %d:%d:%d %d",&a,&b,&c,&d,&e,&f,&x);
long long res=gettimestamp(a,b,c,d,e,f);
res= (res / (x*60)) * x * 60;
PrintTime(res);
}
}