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
",sum) ;
    return 0 ;
}
View Code

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

原文地址:https://www.cnblogs.com/luyingfeng/p/3413667.html