C语言 PTA 后天日期

题目:7-5 后天日期

(题目作者 孙骏  单位 武汉理工大学 WUT)

给定一个日期,格式为yyyy-mm-dd(年份-月份-日期),计算并输出后天的日期,格式为yyyy.mm.dd(4位年份.2位月份.2位日期)。例如:输入2001-12-31,输出为:2002.01.02。

输入格式——输入以"-"分隔的年月日。

输出格式——输出计算后的后天的日期,以"."分隔。行末无多余字符。

输入样例 1:

2001-12-31

输出样例 1:

2002.01.02

输入样例 2:

2008-2-28

输出样例 2:

2008.03.01

 分析:

看着简单,其实暗藏玄ji。

1)注意闰年平年,闰年2月29天,平年2月28天,闰年是可以被4整除而不能被100整除,或被400整除的

2)注意月份,1,3,5,7,8,10,12月31天;4,6,9,11月30天;

3)尤其关注12月份和每月末,前者必要时改变年份,后者必要时改变月份;

代码:

#include<stdio.h>
int main()
{
    int y,m,d,y1,m1,d1;
    scanf("%d-%02d-%02d",&y,&m,&d);
    y1=y;
    m1=m;
    d1=d;
    if((y%4==0&&y%100!=0)||y%400==0){
        if(m==1||m==3||m==5||m==7||m==8||m==10){
            if(d==31){d1=2;m1=m+1;}
            if(d==30){d1=1;m1=m+1;}
            if(d>=1&&d<=29){d1=d+2;}
        }
        if(m==2){
            if(d==29){d1=2;m1=m+1;}
            if(d==28){d1=1;m1=m+1;}
            if(d>=1&&d<=27){d1=d+2;}
        }
        if(m==4||m==6||m==9||m==11){
            if(d==30){d1=2;m1=m+1;}
            if(d==29){d1=1;m1=m+1;}
            if(d>=1&&d<=28){d1=d+2;}
        }
        if(m==12){
            if(d==31){d1=2;y1=y+1;m1=1;}
            if(d==30){d1=1;y1=y+1;m1=1;}
            if(d>=1&&d<=29){d1=d+2;}
        }
    }
    else {
         if(m==1||m==3||m==5||m==7||m==8||m==10){
            if(d==31){d1=2;m1=m+1;}
            if(d==30){d1=1;m1=m+1;}
            if(d>=1&&d<=29){d1=d+2;}
        }
        if(m==2){
            if(d==28){d1=2;m1=m+1;}
            if(d==27){d1=1;m1=m+1;}
            if(d>=1&&d<=26){d1=d+2;}
        }
        if(m==4||m==6||m==9||m==11){
            if(d==30){d1=2;m1=m+1;}
            if(d==29){d1=1;m1=m+1;}
            if(d>=1&&d<=28){d1=d+2;}
        }
        if(m==12){
            if(d==31){d1=2;y1=y+1;m1=1;}
            if(d==30){d1=1;y1=y+1;m1=1;}
            if(d>=1&&d<=29){d1=d+2;}
        }
    }
    printf("%d.%02d.%02d",y1,m1,d1);
    
    return 0;
}

注:

此处第一级if指的是年;

 第二级if指的是各个月份,因为12月与2月太特殊,单独列出;

第三级if则是指天了;

 

  • 6
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值