题目描述

网络时代,机会与危机共存。“千年虫”解决之后,会不会有新的“虫”出现?回答是肯定的,“2038年”就是一个新的关卡。

也许大家都已经知道计算机的2000年问题是什么概念,但是什么时候又冒出来一个2038年问题的呢?

用C语言编制的程序不会碰到2000年问题,但是会有2038年问题。这是因为,大多数C语言程序都使用到一个叫做“标准时间库”的程序库,这个时间库用一个标准的4字节也就是32位的形式来储存时间信息。

当初设计的时候,这个4字节的时间格式把1970年1月1日凌晨0时0分0秒作为时间起点,这时的时间值为0。以后所有的时间都是从这个时间开始一秒一秒累积得来的。

比方说如果时间已经累积到了919642718这个数值,就是说这时距离1970年1月1日凌晨0时0分0已经过去了919642718秒,换算一下就应该是1999年2月21日星期天16时18分38秒。

这样计算时间的好处在于,把任意两个时间值相减之后,就可以很迅速地得到这两个时间之间相差的秒数,然后你可以利用别的程序把它换算成明白易懂的年月日时分秒的形式。

一个4字节也就是32位的存储空间的最大值是2147483647,请注意!2038年问题的关键也就在这里———当时间一秒一秒地跳完2147483647那惊心动魄的最后一秒后,它就会转为负数也就是说时间无效。那一刻的准确的时间为2038年1月19日星期二晚上03:14:07,之后所有用到这种“标准时间库”的C语言程序都会碰到时间计算上的麻烦。

你要解决的问题是,现有一台计算机,表示时间的变量长度为N位。给定一个“时间起点”,求出对于这个“时间起点”时间,最后的有效时间是什么时候。

输入输出格式

输入格式:

第一行为数据组数T

第2……T+1行,每行7个数字描述一组数据,分别为表示时间的变量长度(二进制位数),然后是“时间起点”的年份,月份,日期,小时,分钟,秒数。

输出格式:

T行,对于每组数据,输出1行,6个数字,分别表示最后的有效时间的年份,月份,日期,小时,分钟,秒数。

输入输出样例

输入样例#1: 复制

1
16 2000 1 1 0 0 0
输出样例#1: 复制

2000 1 1 9 6 7
输入样例#2: 复制

2
32 1970 1 1 0 0 0
32 2015 11 8 8 30 0
输出样例#2: 复制

2038 1 19 3 14 7
2083 11 26 11 44 7

说明

对于50%的数据 变量的位数<=16;

对于所有数据,变量长度<=32,数据组数<=1000,0<=年份<=10000

思路:模拟。

#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
int t,sum;
int tian,xh,fz,m;
int up,year,month,day,hour,mint,s;
void work1(int tian,int xh,int fz,int m){
s+=m;if(s>=){ s%=;mint+=; }
mint+=fz;if(mint>=){ mint%=;hour+=; }
hour+=xh;if(hour>=){ hour%=;day+=; }
day+=tian;int flag=;
while(!flag){
flag=;
if(month==||month==||month==||month==||month==||month==||month==){
if(day>){ day-=;month++; }
else flag=;
}
if(month==||month==||month==||month==){
if(day>){ day-=;month++; }
else flag=;
}
if(month==&&((year%!=&&year%==)||year%==)){
if(day>){ day-=;month++;}
else flag=;
}
else if(month==){
if(day>){ day-=;month++; }
else flag=;
}
if(month>){ year++;month=;}
}
}
int main(){
//freopen("lpp.txt","r",stdin);
//freopen("lpp.out","w",stdout);
scanf("%d",&t);
while(t--){
scanf("%d%d%d%d%d%d%d",&up,&year,&month,&day,&hour,&mint,&s);
long long tot=pow(,up-)-;
tian=tot///;
xh=(tot-tian***)//;
fz=(tot-tian***-xh**)/;
m=tot-tian***-xh**-fz*;
work1(tian,xh,fz,m);
printf("%d %d %d %d %d %d\n",year,month,day,hour,mint,s);
}
}

最新文章

  1. How to accept Track changes in Microsoft Word 2010?
  2. VS2015 出现 .NETSystem.Runtime.Remoting.RemotingException: TCP 错误
  3. CentOS 6.5 安装HDFS集群(Hadoop-2.7.3)
  4. NSString,NSArray,NSNumber等类的继承问题
  5. KM模板
  6. sql2008备份集中的数据库备份与现有的xxx数据库不同解决方法
  7. HDU-4089 Activation (概率DP求概率)
  8. 小数点输出精度控制问题 .xml
  9. Intellij IDEA 构建Spring Web项目 — 用户登录功能
  10. JAVA访问配置文件总结
  11. win 开机 Microsoft corparation 滚动栏
  12. javascript动画效果之缓冲动画
  13. 提升html5的性能体验系列之二列表流畅滑动
  14. Win10图片打开方式没有“Windows照片查看器”,如何找回?
  15. [HAOI 2009]逆序对数列
  16. 电脑小白和ta的小白电脑——Tomcat服务器
  17. 制作系统U盘
  18. centos7.4_x86_64安装grafana5.2.1并安装常用zabbix插件
  19. python 验证码识别示例(二) 复杂验证码识别
  20. 【HANA系列】SAP HANA XS的JavaScript API详解

热门文章

  1. 用 shell 获取本机的网卡名称
  2. Flask Flash闪现
  3. Gym - 100625E Encoded Coordinates 矩阵快速幂
  4. HDU 4349 Xiao Ming&#39;s Hope 组合数学
  5. Spring Security Architecture--官方
  6. 1.9 Python基础知识 - 数值运算
  7. Linux下配置Squid基础教程
  8. sql的四大函数
  9. 用json2.js 代替 json.js防止与jQuery的js冲突
  10. Concurrent.Thread.js