淘先锋技术网

首页 1 2 3 4 5 6 7

最近博主参加了学校的一个小测试,其中有个日历问题说当前为某年某月某日星期几,让你输入一个数n,算出n天后是多少年多少月多少日星期几;

完了之后博主当时并没有做出来,因为自己的方法还是比较复杂,代码也比较多。然后今天刚好和同学讨论到这个题发现他的方法比较简单,代码也少,总共就二十多行代码,在此分享给各位需要的同学;


问题描述:

假设现在是2016年1月1号周五,请你输入一个数n,编程计算n天后的日期;

(输入-1表示结束,假设年份不会超过9999);


完整代码:

#include <iostream>

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


int main()
{
    char week[][20] = {"Friday", "Saturday", "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday"};
    int  year[] = {365,366};
    int  month[][12] = {31,28,31,30,31,30,31,31,30,31,30,31,31,29,31,30,31,30,31,31,30,31,30,31};
    int days, dayOfWeek, i, j;
    
    while (scanf("%d", &days) && days >= 0)
    {
        dayOfWeek = days % 7;

        for (i = 2016; days >= year[judge(i)]; ++i)
            days -= year[judge(i)];
        for (j = 0; days >= month[judge(i)][j]; ++j)
            days -= month[judge(i)][j];

        printf("%d-%d-%d-%s\n", i, j + 1, days + 1, week[dayOfWeek]);
     }

    return 0;
}


这道题考察了两个问题:

1、闰年的判断;

2、周几的判断;

分析:

1、对于第一个问题我们可以单独写出一个返回bool类型的函数来进行年份判断;

而闰年我们都知道:能被4整除,或者能被100整除而不能被400整除的年份

有这样两种方法:

// one 

if (n % 4 == 0) return 1;

else

if (n %100 == 0 && n % 400 != 0) return 1;

else return 0;

//  two

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

else return 0;

其实这两种方法都是一个意思,只是在写法上有所差距;值得注意的是,我们在写判断条件的顺序的时候一定要注意,因为如果是||和&&操作符的话,会容易出现短路求值的情况,导致后面的表达式计算不到,从而产生预料之外的结果;

2、对于第二个问题其实也很简单;

比如今天周x,计算之后的周几数就应该是初始值往后数 天数对7取余天;(设今天是周5,如果天数是37,那就是往后数37对7取余2天,所以就是1周六,2周天,所以37天后就是周天);


我个人觉的这个代码比较简洁的地方就在于,它直接将闰年非闰年,每个月,周几数,直接初始化到数组中,这样就避免了初学阶段的时候对其的不停判断计算繁琐的代码中,而且这样的话也比较容易理解。

所以之后有这样类似的数据或者问题出现时,就也可以这样考虑,将数据初始化到数组中,将关键部分的代码提取出来写成单独的小函数,之后需要的时候直接调用即可。