【题解】《C语言入门100例》(第19例) 日期

AA 2021-11-20 17:37:43

目录

 

总的思路

一周中的第几天

一年中的第几天

(附加)两个日期相差几天


总的思路

计算日期这种题,一般都是计算日期之差来解决。比如计算两个日期之差,就分别计算他们到某一天(便于计算的日期)的差,再将两个差相减。

一周中的第几天

思路:读题可知最早日期为1971-1-1,这一天刚好为周五,那么只需要计算日期到1971-1-1的差然后模7即可计算出周几。

注意当前年份如果为闰年且月份大于二月,总的日期要多加一天。

int isleap(int n)
{
    if((n % 4 == 0 && n % 100 != 0) || n % 400 == 0)
    {
        return 1;
    }
    return 0;
}
char * dayOfTheWeek(int day, int month, int year){
    char* ans[] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};
    int mon[13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
    int sum = 0;
    if(isleap(year) && month > 2)
        {
            sum += 1;
        }
    for(int i = 1971; i < year; i++)
    {
        if(isleap(i))
            sum += 366;
        else
            sum += 365;
    }

    for(int i = 1; i < month; i++)
    {
        sum += mon[i];
    }

    sum += day;
    return ans[(5 + sum - 1) % 7];
}

 

一年中的第几天

思路:只需要计算月和日,注意的是如果为闰年且月份大于二月,要多加一天。 

int dayOfYear(char * date){
    int mon[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
    int sum = 0, i, y, m, d;
    sscanf(date, "%d-%d-%d", &y,&m,&d);
    if(isleap(y) && m > 2)
        {
            sum += 1;
        }
    
    while(m > 1)
    {
        sum += mon[m-2];
        m--;
    }

    sum += d;
    return sum;
}

int isleap(int n)
{
    if((n % 4 == 0 && n % 100 != 0) || n % 400 == 0)
    {
        return 1;
    }
    return 0;
}

(附加)两个日期相差几天

思路:计算两个日期到0000-0-0的差后做差即可。

int isleap(int n)
{
    if((n % 4 == 0 && n % 100 != 0) || n % 400 == 0)
    {
        return 1;
    }
    return 0;
}

int count(int y, int m, int d)
{
    int mon[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
    int sum = 0;
    if(isleap(y) && m > 2)
        {
            sum += 1;
        }
    while(m > 1)
    {
        sum += mon[m-2];
        m--;
    }
    while(y)
    {
        y--;
        if(isleap(y))
        {
            sum += 366;
        }
        else sum += 365;
    }
    sum += d;
    return sum;
}

int daysBetweenDates(char * date1, char * date2){
    int i, y1, y2, m1, m2, d1, d2, sum1 = 0, sum2 = 0;
    sscanf(date1, "%d-%d-%d", &y1,&m1,&d1);
    sscanf(date2, "%d-%d-%d", &y2,&m2,&d2);
    sum1 = count(y1, m1, d1);
    sum2 = count(y2, m2, d2);
    return abs(sum1 - sum2);
}

 

 

...全文
72 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

64,195

社区成员

发帖
与我相关
我的任务
社区描述
学习「 算法 」的捷径就是 「 题海战略 」,社区由「 夜深人静写算法 」作者创建,三年ACM经验,校集训队队长,亚洲区域赛金牌,世界总决赛选手。社区提供系统的训练,答疑解惑,面试经验,大厂内推等机会
社区管理员
  • 英雄哪里出来
  • 芝麻粒儿
  • Amy卜bo皮
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

QQ群:480072171

英雄算法交流 8 群

 

试试用AI创作助手写篇文章吧