• 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日到他们的距离,再求差,当然了,因为上下两个年份不知道谁大谁小,所以要加绝对值,这种方法简单不易出错,代码量还小一半左右,想实现的可以试试哦

  • 相关阅读:
    排序
    Apache架设Web服务器
    函数调用规范
    linux启动流程
    Make工程管理器
    网络相关知识
    数字电路中的建立时间与保持时间
    面试碰到的技术题
    嵌入式linux的驱动程序
    EF实体中的修改
  • 原文地址:https://www.cnblogs.com/luyingfeng/p/3413667.html
Copyright © 2020-2023  润新知