【问题描述】
设计一个程序用于向后推算指定日期经过n天后的具体日期。
【输入形式】
-
输入为长度为8的字符串str和一个正整数n,str前四位表示年份,后四位表示月和日。
【输出形式】
-
当推算出的年份大于4位数时,输出"out of limitation!",否则输出8位的具体日期。
【样例输入1】
00250709 60000
【样例输出1】
01891017
【样例输入2】
19310918 5080
【样例输出2】
19450815
【样例输入3】
99980208 999
【样例输入3】
out of limitation!
【样例说明】
-
日期的表示必须8位数,年月日不足长度需要添加前缀字符'0'。
-
注意闰年和平年的2月份天数不同。
-
注意判断输出信息是否符合要求。
【评分标准】
共5个测试用例
#include<iostream>
using namespace std;
int a[2][12] = { { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 },
{ 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 } };
int b[2] = { 365,366 };
int judge(int a);
int days_1(int year, int month, int day);
void days_2(int sum, int &year, int &month, int &day);
int main() {
char c[9];
int n, y1;
cin >> c >> n;
int year, month, day;
//化年,月,日为数字
year = 1000 * (c[0] - 48) + 100 * (c[1] - 48) + 10 * (c[2] - 48) + (c[3] - 48);
month = 10 * (c[4] - 48) + (c[5] - 48);
day = 10 * (c[6] - 48) + (c[7] - 48);
//减去闰年多的一天
y1 = year;
year = y1 + n / 365;
n = n % 365;
for (int t = y1; t <= year; t++) {
if ((t % 4 == 0 && t % 100 != 0) || t % 400 == 0) n--;
}
//判断是否超出年份限制
if (year > 9999) {
cout << "out of limitation!" << endl;
} else {
n += days_1(year, month, day);
days_2(n, year, month, day);
if (year < 1000 && month < 10 && day < 10) {
cout << "0" << year << "0" << month << "0" << day << endl;
} else if (year < 1000 && month < 10) {
cout << "0" << year << "0" << month << day << endl;
} else if (month < 10 && day < 10) {
cout << year << "0" << month << "0" << day << endl;
} else if (year < 1000){
cout << "0" << year << month << day << endl;
} else if (month < 10) {
cout << year << "0" << month << day << endl;
} else if (day < 10) {
cout << year << month << "0" << day << endl;
} else {
cout << year << month << day << endl;
}
}
return 0;
}
int judge(int a) {
//是否是闰年,是则返回1,不是则返回0
if ((a % 4 == 0 && a % 100 != 0) || a % 400 == 0) {
return 1;
}
else return 0;
}
int days_1(int year, int month, int day) {
//返回从1年1月1日开始(包括当天)到输入天数(不包括当天)所经历的天数
int sum = 0;
for (int i = year; i > 1; i--) {
sum += b[judge(i)];
}
for (int j = month; j > 1; j--) {
sum += a[judge(year)][j - 1];
}
sum += day - 1;
return sum;
}
void days_2(int sum, int &year, int &month, int &day) {
//输入n(n大于0),则返回从1年1月1日(包括当天)开始经过了n天后的日期(不包括当天)
for (year = 1; sum >= b[judge(year)]; year++) {
sum -= b[judge(year)];
}
for (month = 0; sum >= a[judge(year)][month]; month++) {
sum -= a[judge(year)][month];
}
month++;
day = sum + 1;
}