给你一个日期,请你设计一个算法来判断它是对应一周中的哪一天。

输入为三个整数:day、month 和 year,分别表示日、月、年。

您返回的结果必须是这几个值中的一个 {“Sunday”, “Monday”, “Tuesday”, “Wednesday”, “Thursday”, “Friday”, “Saturday”}。

示例 1:

输入:day = 31, month = 8, year = 2019
输出:“Saturday”
示例 2:

输入:day = 18, month = 7, year = 1999
输出:“Sunday”
示例 3:

输入:day = 15, month = 8, year = 1993
输出:“Sunday”

提示:

给出的日期一定是在 1971 到 2100 年之间的有效日期。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/day-of-the-week
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

本来是想用今天的日期和星期来作为标准通过计算获取任意天的星期的,结果发现越弄越复杂,先把这种方式没完成的代码存在这

char * dayOfTheWeek(int day, int month, int year){char *wday[]=["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"];int wmonth[]=[31,28,31,30,31,30,31,31,30,31,30,31];int diffd=0,diffm=0,diffy=0,i=0;if(year < 2021){diffy = 2021-year-1;diffd = 61+diffy/4+365*diffy;if(month == 1)diffd = diffd+(365-day);else{for(i=month-1;i<month;i++)diffd = diffd+wmonth[i]; }}
}

第二次想的方法是直接以1971年1月1日星期五作为基准,这样就可以大幅度减少判断流程和计算量

/*int isrun(int year){if((year%100 != 0 && year%4 == 0) || (year%100 == 0 && year%400 == 0))return 1;elsereturn 0;
}*/char * dayOfTheWeek(int day, int month, int year){char *wday[7]={"Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"};int wmonth[]={31,28,31,30,31,30,31,31,30,31,30,31};int diffd=0,diffm=0,diffy=0,i=0;diffy = year-1971;diffm = month-1;diffd = day-1;if(month > 2 && ((year%100 != 0 && year%4 == 0) || (year%100 == 0 && year%400 == 0))) //可替代为isrun函数判断是否为闰年diffd = diffd+(year-1969)/4+diffy*365+1;elsediffd = diffd+(year-1969)/4+diffy*365;if(month > 1){for(i=0;i<diffm;i++)diffd = diffd+wmonth[i];}return wday[(5+diffd%7)%7];
}

还可以用基姆拉尔森公式(Kim larsen calculation formula

注意:在公式中有个与其他公式不同的地方:
把一月和二月看成是上一年的十三月和十四月,例:如果是2004-1-10则换算成:2003-13-10来代入公式计算。

char * dayOfTheWeek(int day, int month, int year){char *wday[7]={"Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"};int w=0;if(month == 1 || month == 2){month = month+12;year = year-1;}w = (day+2*month+3*(month+1)/5+year+year/4-year/100+year/400+1)%7;return wday[w];
}

另外:C语言中定义字符串数组时有两种方法:
方法1:定义一个char类型的二维数组
这种方法是通过定义一个char类型的二维数组实现,通过二维数组的行索引可得到数组中的每个字符串,列的大小限定了每个字符串所能包含的最大字符个数,所以采用这种定义方式时,列的大小必须不能小于数组所有字符串的最大长度。如对于上面的数组,C语言的定义代码如下:

char wday[7][10]={"Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"};

在取该数组的每个字符串时,直接对行索引即可

方法2:定义一个指向char类型的指针数组
这种方法是通过定义一个指向char类型的指针数组实现,数组中的每个元素都是一个指针,通过该指针可得到数组中的每个字符串。如对于上面的数组,C语言的定义代码如下:

char *wday[7]={"Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"};

两种方法对比
上面的两种方法都可以实现我们的目的,但在内存的占用上两种方法不同。第1种方法定义了一个5行20列的二维数组,即每个字符串所占的字节长度都为20个,所以共需要占用100个字节,而第2种方法是定义的指针数组,每个指针指向的字符串占用的字节长度是其实际长度,所以其总的长度肯定小于100个字节。综合来讲,第1种方法相对于第2种方法,造成了存储空间的浪费情况

引用时,第一种方法:wday[i];;第二种方法:wday[i];

自用笔记44——基姆拉尔森公式和字符串数组相关推荐

  1. 基姆拉尔森公式--判断星期几

    An problem about date 时间限制:2000 ms  |  内存限制:65535 KB 难度:2 描述 acm的iphxer经常忘记某天是星期几,但是他记那天的具体日期,他希望你能写 ...

  2. 算法中的数学--基姆拉尔森公式

    文章目录 题目描述 第一种解法 第二种解法(基姆拉尔森公式) 题目描述 wjw最近运气极其差,什么roll点1-100连着十次都是个位数啊,买个珍珠奶茶没有珍珠啊,吃方便面没有调料包啊- 迷信的wjw ...

  3. Java通过基姆拉尔森公式判断当前日期是不是工作日

    基姆拉尔森公式 算法如下: 基姆拉尔森计算公式 W= (d+2*m+3*(m+1)/5+y+y/4-y/100+y/400+1)%7 在公式中d表示日期中的日数,m表示月份数,y表示年数. 注意:在公 ...

  4. 【每日一题】美国节日(基姆拉尔森公式、蔡勒公式)

    [每日一题]美国节日(基姆拉尔森公式.蔡勒公式)   相关文章:   [每日一题]一周中的第几天(基姆拉尔森公式的应用)   [每日一题]美国节日(基姆拉尔森公式.蔡勒公式)   [每日一题]计算日期 ...

  5. 关于某个日期快速计算是星期几(基姆拉尔森公式)

    前言 如果有这样的问题:如果y年m月d日是星期k,那么请问y1年m1月d1日是星期几? 思路 首先如果询问的日期都在1970年之后的话,我们可以使用Excel直接计算. Java的Calendar类, ...

  6. 基于基姆拉尔森公式的日期到星期的转换推导

    目录 引言 符号说明(现实中日期) 特殊日期假设 基姆拉尔森公式推导 重新推导 最终公式 参考文献 引言 做日历的时候,我们总是希望能够通过日期(年月日)得到星期.在这里,我们将对基姆拉尔森(Kim ...

  7. 基姆拉尔森公式和蔡勒公式(计算星期几)

    给定一个xxxx-xx-xx日期,计算为星期几. 直接使用基姆拉尔森计算公式,外文名是Kim larsen calculation formula. 从 公元0年1月1日星期日 开始,已考虑各种因素. ...

  8. 推导基姆拉尔森公式根据日期计算星期

    转自:http://topic.csdn.net/t/20050425/23/3966336.html ================================================ ...

  9. HDU 6112 今夕何夕【2017百度之星】【日期模拟计算】【基姆拉尔森计算公式】【蔡勒公式】

    今夕何夕 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submi ...

最新文章

  1. C语言 条件编译详解
  2. Image打包流程-Android10.0编译系统(四)
  3. 登录日志怎么实现_【创新攻关】安全室构建异常登录行为检测审计模型
  4. es查询index生成时间_Elasticsearch开始的第一步索引index
  5. ad18原理图器件批量修改_Altium Designer 15原理图设计基础
  6. [Swift]LeetCode1017. 负二进制转换 | Convert to Base -2
  7. mysql完全卸载大全
  8. 【转】Linux内核结构详解
  9. mysql sqlyog讲解_详细讲解如何用SQLyog来分析MySQL数据库
  10. 结合Android源码分析总结单例模式的几种实现方式
  11. 史上最强三千六百道脑筋急转弯(4)
  12. DH参数(Denavit-Hartenberg parameters)
  13. 雷达初学者必读 | 毫米波雷达信号处理入门教程
  14. 手机图标ui设计尺寸:ui设计app图标尺寸规范
  15. 基于SpringBoot的报刊订阅管理系统
  16. 38岁天才科学家掌舵,三年半累亏30亿,第四范式冲刺港股IPO
  17. echaarts水滴(水球图)波浪效果
  18. 计算机网络第五弹——运输层
  19. IE浏览器input元素text-overflow: ellipsis
  20. POJ3164 最小树形图 有向图的最小生成树 模板题 朱刘算法 朱永津-刘振宏算法

热门文章

  1. centos服务器部署
  2. 手把手教你写一个基于python+pyqt5的股票盯盘软件
  3. 永不消逝的电波(四):从无线电角度揭秘定位劫持
  4. 【webrtc】 CongestionControlHandler 的 RTC_DCHECK_RUN_ON(sequenced_checker_);
  5. 选择适合的Silverlight通信技术
  6. 音频质量的评价方法:简单梳理
  7. 机器学习中qa测试_如何使用AI和机器学习的QA测试软件
  8. Elasticsearch大数据量写入调优和原理解析
  9. VB里的 dim是什么意思?
  10. kubernetes-v1.15.0安装【使用kubeadm部署Kubernetes-跳过国内网络问题】