日期及时间问题-日历问题

最近博主参加了学校的一个小测试,其中有个日历问题说当前为某年某月某日星期几,让你输入一个数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天后就是周天);


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

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


  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
之前在网上想找一个简单易用的周日历选择插件,发现这种前端周日历插件很少,而且很多文章写的周的算法都不是统一的,所以自己实现了一个基于jquery的周日历插件(还支持跳转到指定年份和周哦)。 插件中周的算法:每周以周日为起始,第一周以每年第一个星期四所在的周为第一周(网上找的好像这个算法比较正规) 实现的效果是在手机端,也可以在PC端用,毕竟功能才是主要的。如果觉得样式不入眼可以自行随意修改。 //调用周日历方法 var weekfn = new jcalendar_week({ element: "#jcalendar_week",//填充日历的dom元素 dayaddclass:function(date){ //添加某天时给添加类名(参数:1.日期)(返回类名字符串,多个以空格分开) return ""; }, dayclick:function(date,obj){ //day点击事件(参数:1.日期,2.所点击DOM元素) $(obj).addClass("calendar_day_act").siblings().removeClass("calendar_day_act"); } }); 点击上方显示当前年份和周的DOM部分可选择并跳转到指定年份和周。 插件提供的方法: //获取周第一天方法weekfirstdate(),传入年份和周数 console.log(weekfn.weekfirstdate(2018,36)); //获取传入日期为当年第几周getweeknum(),传入年,月,日(注:这里的月份从0开始) console.log(weekfn.getweeknum(2018,0,16)); //跳转到指定周confirmweek(),传入年份和周数 weekfn.confirmweek(getyear,getweek); //跳转到本周nowweek() weekfn.nowweek();

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值