日期推算(C++)

【问题描述】

设计一个程序用于向后推算指定日期经过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;
}

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

*OASIS*

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值