某天向前,向后是几月几号

今天是HRBUST2019级新生赛正赛,小赵和小陈兴高采烈的来到了比赛场上。

这时,小陈突然想到了前天老师说10天后要检查的大作业,便问小周:“10天后的安卓作业准备的怎么样了?”。

这时小周问道:“10天?今天是2019年11月16号,上次说的10天到今天算就只有8天了,哪来的10天!想些啥呢你!”。

小陈:“是是是,你厉害,你算的准,只有8天了,那我问你,50天后是几号?”。

小周自信的回答道:“今天是16号,加上50就是66,减去这个月的30天就还剩36天,再减去下个月的31天就还剩5天,所以答案是明年的1月5号,怎么样?没算错吧!”

“再来”,小陈继续问道“100天后呢?200天后呢?”

这时小周被一连串的问题给问烦了,说道:“你等着,等我写个程序,随便你问”。

       这时小周来找你,请你帮他写出这个程序。

输入

题目有多组测试数据,处理到文件结束。

      下面每组测试数据一行一个整数n,请计算出n天后是几号。(-10000<=n<=10000)。

输出

        每组测试数据输出”YYYY MM DD”代表YYYY年MM月DD日。

样例输入 Copy

0
1
-1

样例输出 Copy

2019 11 16
2019 11 17
2019 11 15

提示

注意年份用前导0补齐四位,月份和日用前导零补齐两位。

题目大意:就是说给你今天的日期(如:2019年11月26日)问你向前或者向后n(-10000<=n<=10000)天是那一年那一月那一日

AC代码:(可能有带你啰嗦,大神勿喷)

#include <iostream>
using namespace std;
int main(){
    int y,m,d,dmax;
    int d1;
    y=2019,m=11,d=16;
    while(~scanf("%d",&d1)){
        if(d1>0){
            for(int i=1;i<=d1;i++){
                    switch(m){
                case 1:
                case 3:
                case 5:
                case 7:
                case 8:
                case 10:
                case 12:
                    dmax=31;
                    break;
                case 4:
                case 6:
                case 9:
                case 11:
                    dmax=30;
                   break;
            }
            if(m==2){
                if(y%400==0||y%100!=0&&y%4==0){
                    dmax=29;    
                }else{
                    dmax=28;
                }
            }
                if(d<dmax){
                    d++;
                }else if(d==dmax&&m<12){
                    m=m+1;
                    d=1;
                }else if(m==12&&d==31){
                    y=y+1;
                    m=1;
                    d=1;
                }
            }
        }
        else if(d1<0){
            d1=-d1;
            for(int i=d1;i>=1;i--){
                    switch(m){
                case 1:
                case 2:
                case 4:
                case 6:
                case 8:
                case 9:
                case 11:
                    dmax=31;
                    break;
                case 5:
                case 7:
                case 10:
                case 12:
                    dmax=30;
                   break;
            }
            if(m==3){
                if(y%400==0||y%100!=0&&y%4==0){
                    dmax=29;    
                }else{
                    dmax=28;
                }
            }
                if(d>1){
                    d--;
                }else if(d==1&&m>1){
                    m=m-1;
                    d=dmax;
                }else if(m==1&&d==1){
                    y=y-1;
                    m=12;
                    d=dmax;
                }
            }
        }
        printf("%04d %02d %02d
",y,m,d);
        y=2019,m=11,d=16;
    }
    return 0;
}

实例二:

ZCQ老师的生日是Y年M月D日,他想知道自己出生后第一万天纪念日的日期(出生日算第0天)。
输入
只有一行,分别读入Y,M,D(分别代表年、月、日),日期绝对合法。
(1900<=Y<=2008,1<=M<=12,1<=D<=31)
输出
只有一行,即ZCQ老师生日第一万天以后的日期,格式为“Y-M-D”。
(注意年月日之间用横线连接)
样例输入 Copy
1979 4 16
样例输出 Copy
2006-9-1
#include <iostream>
using namespace std;
int main() {
    int y,m,d,dmax;
    cin>>y>>m>>d;
    for(int i=1;i<=10000;i++){//把10000改为任意数就变成任意天后的日期
            switch(m){
        case 1:
        case 3:
        case 5:
        case 7:
        case 8:
        case 10:
        case 12:
            dmax=31;
            break;
        case 4:
        case 6:
        case 9:
        case 11:
            dmax=30;
           break;
    }
    if(m==2){
        if(y%400==0||y%100!=0&&y%4==0){
            dmax=29;    
        }else{
            dmax=28;
        }
    }
        if(d<dmax){
            d++;
        }else if(d==dmax&&m<12){
            m=m+1;
            d=1;
        }else if(m==12&&d==31){
            y=y+1;
            m=1;
            d=1;
        }
    }
    cout<<y<<"-"<<m<<"-"<<d;
    return 0;
}
原文地址:https://www.cnblogs.com/lipu123/p/12159162.html