codeup1928日期处理

题目描述
有俩个日期,求两个日期之间的天数,如果这两个日期是连续的,则规定他们之间的天数为两天

输入格式
有多组数据,每组数据有两行,分别表示两个日期,形式为YYYYMMDD。
输出格式
每组数据输出一行,及日期差值
样例输入

20130101
20130105

样例输出

5

思路一: 使用一天一天来数的方式进行计算,分组输入可以使用[[01.C:EOF理解#^1aa5ff|EOF]]来进行控制。
代码

#include<cstdio>
int mouth[13][2] = {//平年和闰年每个月的天数
    {0,0}, {31,31}, {28,29},{31,31},{30,30},{31,31},{30,30},{31,31},{31,31},{30,30},{31,31},{30,30},{31,31}
};
bool isLeap(int year){//判断是否为闰年
    return (year % 4 == 0 && year % 100 != 0)||(year % 400 == 0);
}
int main(){
    int time1, y1, m1, d1;
    int time2, y2, m2, d2;
    while (scanf("%d%d", &time1, &time2) != EOF)
    {
        if (time1 > time2)  // 第一个日期晚于第二个日期,交换
        {
            int temp = time1;
            time1 = time2;
            time2 = temp;
        }
        y1 = time1 / 10000, m1 = time1 % 10000 / 100, d1 = time1 % 100;
        y2 = time2 / 10000, m2 = time2 % 10000 / 100, d2 = time2 % 100;
        int ans = 1; //记录结果
        while (y1 < y2 || m1 < m2 || d1 < d2)
        {
            d1++;
            if (d1 == mouth[m1][isLeap(y1)] + 1){
                m1++;
                d1 = 1;
            }  // 满当月天数
            if (m1 == 13)
            {
                y1++;
                m1 = 1;
           }
            ans++;
        }
        printf("%d\n", ans);
    }
    return 0;
}

思路二: 采用直接计算的方法,将年,月,日分开计算,可以大幅度减小时间复杂度。
代码如下:

#include<cstdio>
int mouth[13][2] = {//平年和闰年每个月的天数
    {0,0}, {31,31}, {28,29},{31,31},{30,30},{31,31},{30,30},{31,31},{31,31},{30,30},{31,31},{30,30},{31,31}

};
bool isLeap(int year){//判断是否为闰年
    return (year % 4 == 0 && year % 100 != 0)||(year % 400 == 0);
}
int main(){
    int time1, y1, m1, d1;
    int time2, y2, m2, d2;
    while (scanf("%d%d", &time1, &time2) != EOF)
    {
        if (time1 > time2)  // 第一个日期晚于第二个日期,交换
        {
            int temp = time1;
            time1 = time2;
            time2 = temp;
        }
        y1 = time1 / 10000, m1 = time1 % 10000 / 100, d1 = time1 % 100;
        y2 = time2 / 10000, m2 = time2 % 10000 / 100, d2 = time2 % 100;
        //采用统一计算的方法
        int ans = 0;
        if (y1 != y2)  // 计算y1剩余天数
        {
            ans += (mouth[m1][isLeap(y1)] - d1);
            m1++;
            for(int i = m1;i <= 12; i++){
                ans += mouth[i][isLeap(y1)];
            }
            y1++;
            m1 = 1;
            d1 = 1;
        }
        if(y1 != y2){
            for (int i = y1; i < y2; i++)
            {
                if(isLeap(i)) ans += 366;
                else ans += 365;
            }
            y1 = y2;
        }
        if(m1 != m2){
            ans += (mouth[m1][isLeap(y2)] - d1);
            m1++;
        }
        for (int i = m1; i < m2; i++)
        {
            ans += mouth[i][isLeap(y2)];
        }
        ans += (d2 - d1 + 1);
        printf("%d\n", ans);
    }
    return 0;
}
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇