1. 题目
纪念日(Date.pas/c/cpp)
题目描述
新兵入队的日子是YY年MM月DD日,他们觉得这个日子特别有意义,所以决定过n天搞一次活动来纪念这个日子,可是他们不知道n天后是什么日子,所以请你帮忙计算一下日期(入队日算第0天)。
输入数据
文件第一行读入n (0<=n<=50000)
从文件的第二行分别读入YY,MM,DD其中1949<=YY<=1992,日期绝对合法。
输出数据
输出文件只有一行,即CCC老师生日第一万天以后的日期,格式为 “Y-M-D”。
样例输入
10000
1979 4 16
样例输出
2006-9-1
2. 题目实质
模拟,日期的计算。
3. 算法
模拟。这个要用真正的模拟来做,一天天的往下数,反正只有几万天,不会超时。
事实上,对于日期类模拟来说,这无疑是最简单最有效的方法。
如果有兴致,当然也可以按照数学方法来一块时间一块时间的算,错了后果自负。
4. 注意事项
只要判断一下,这个只不过是一个进制有点变态的进位加法。
5. 程序代码
SueMiller (Pascal)
const mon:array[1..12]of integer=(31,28,31,30,31,30,
31,31,30,31,30,31);
var n:longint;
yy,mm,dd:longint;
p:longint;
function check(y:longint):boolean;
begin
if ((y mod 4=0) and (y mod 100<>0)) or(y mod 400=0) then exit(true);
exit(false);
end;
begin
assign(input,'Date.in');reset(input);
assign(output,'Date.out');rewrite(output);
readln(n);
readln(yy,mm,dd);
while n>0 do
begin
p:=mon[mm];
if (mm=2) and (check(yy)) then inc(p);
inc(dd);dec(n);
if dd>p then begin dd:=1;inc(mm);end;
if mm>12 then begin inc(yy);mm:=1;end;
end;
writeln(yy,'-',mm,'-',dd);
close(input);close(output);
end.