SDUT2191Calendar

http://acm.sdut.edu.cn/sdutoj/problem.php?action=showproblem&problemid=2191

题意:给你两个年月日,让你算出其中经历了多少天输出 。

思路 :这个题是一个大大的模拟,可惜比赛的时候我都卡了一个半小时,又回去改了好久脑子都废了。今早上才在二师兄的点播之下才知道,原来年月日不一定上边的小,所以要判断一下,我就是因为这个WA了十几遍。。。。T_T。。。。。。。

 

#include<stdio.h>

#include<cmath>

#include<iostream>



using namespace std ;



struct node

{

    int year ;

    int month ;

    int date ;

} ch,sh;



int is_leap(int n)

{

    if(n%400 == 0||(n%4==0&&n%100!=0))

        return 1 ;

    return 0 ;

}



int main()

{

    int sum = 0 ;

    int mon[13] = {0,31,28,31,30,31,30,31,31,30,31,30,31} ;

    scanf("%d:%d:%d",&ch.year,&ch.month,&ch.date) ;

    scanf("%d:%d:%d",&sh.year,&sh.month,&sh.date) ;

    if(ch.year > sh.year)

    {

        swap(ch.year,sh.year) ;

        swap(ch.month,sh.month) ;

        swap(ch.date,sh.date) ;

    }



    if(ch.year == sh.year)

    {

        if(ch.month > sh.month)

        {

            swap(ch.year,sh.year) ;

            swap(ch.month,sh.month) ;

            swap(ch.date,sh.date) ;

        }

        if(ch.month == sh.month)

            sum += fabs(sh.date-ch.date) ;

        else

        {

            for(int i = ch.month+1 ; i < sh.month ; i++)

                sum += mon[i] ;

            sum += (mon[ch.month]+1-ch.date) ;

            sum += sh.date ;

            sum -= 1 ;

            if(is_leap(ch.year)&&ch.month <= 2&&sh.month > 2)

                sum++ ;

        }

    }

    else

    {

        for(int i = ch.year+1 ; i <= sh.year-1 ; i++)

        {

            sum+=365 ;

            if(is_leap(i))

                sum++ ;

        }

        if(ch.month != 12)

        {

            for(int i = ch.month+1 ; i <= 12 ; i++)

                sum += mon[i] ;

            if(ch.month <= 2&&is_leap(ch.year))

                sum ++ ;

        }

        sum += (mon[ch.month]+1-ch.date) ;

        if(sh.month!= 1)

        {

            for(int i = 1 ; i <= sh.month-1 ; i++)

                sum+=mon[i]  ;

            if(sh.month > 2&&is_leap(sh.year))

                sum++ ;

        }

        sum += sh.date-1 ;

    }

    printf("%d\n",sum) ;

    return 0 ;

}
View Code

 

当然还有一种做法,因为题目中是说年份是大于等于1900小于等于2038的,所以当你输入两个月份的时候,就以1900年01月01日为准,用两个年份分别算从1900年01月01日到他们的距离,再求差,当然了,因为上下两个年份不知道谁大谁小,所以要加绝对值,这种方法简单不易出错,代码量还小一半左右,想实现的可以试试哦

 

你可能感兴趣的:(calendar)