根据日期推算星期几——含判断日期正误
正好做到这一道布置的选做题,也是在debug了差不多一个小时后才通过所有实例。
不愧是学校布置的题目的隐藏示例,我都不知道错在哪里,啥都保密。
题目如下:
再次给出任意一个年月日(年>1900),现在我们不能只是直接计算,要先判断给出的日期是否合法,对于非法的日期要给出错误提示信息,合法的日期要再计算是星期几。
输出:0~6。
星期日用 0 表示,星期一用 1 表示,星期二用 2 表示......星期六用 6 表示
对于月份,日期不合法的,需要输出相应语句,即"month is error"或者"day is error"
先给出我的算法:
比起其他大佬那些用公式暴力秒杀的,我发现那更适合对原始算法的优化,我这里就给出适合教学进度的基础算法,不能保证高效,但是都是正确的。
首先是判断一年是否是闰年,这个可以使用一个bool类型的函数,如下:
bool iffrun(int n)
{ if((n%4==0&&n%100!=0)||n%400==0) { return true; } return false;
}
然后是对于输入年份之前出现的闰年数量的统计,可以利用上面这一个函数进行遍历:
这样调用了上面的判断函数。
int ifrun(int start,int end)
{ int i=0; int count=0; for(i=start;i<end;i++) // start 可以规定成1900,遍历刀输入年份的前一年{ if(iffrun(i)) { count++; } } return count;
}
既然讲到了这里的算法,我就先介绍我对统计天数的算法,最暴力的算法之一:
这个算法主要考虑的就是计算整年,整月,最后再加上日期里面的days,注意着重考虑闰年对一年的天数和二月份的天数的影响即可。
else{int res=ifrun(1900,a); // 统计闰年的个数int num=365*(a-1900)+res; // 闰年多一天,闰年总个数int i=b-1; // b 是月份,这个月还没过完while(i) { switch(i) // 对月份的循环,算出整月的天数,注意二月的天数需要考虑输入年{ case 1:num+=31;break; case 2:num+=iffrun(a)?29:28;break; case 3:num+=31;break; case 4:num+=30;break; case 5:num+=31;break; case 6:num+=30;break; case 7:num+=31;break; case 8:num+=31;break; case 9:num+=30;break; case 10:num+=31;break; case 11:num+=30;break; case 12:num+=31;break; } i--; // 月份调整} num+=c-1; // 加上输入的日期,最后再减一,这是减去1900/1/1,数学脑经急转弯int k=(num+1)%7; // 算出星期几printf("%d\n",k); }
最后来到让我难受半个多小时的debug合法日期:
首先是月份需要大于0小于13,对于我这个算法,如果输入的月份是0,那么就会运行超时,这个错误有在我的结果报告出现过
然后就是天数,大月天数小于32,小月天数小于31,平二月天数小于29,闰二月天数小于30,所有的天数都要大于0,这就是所有条件:
if(b>12||b<1){printf("month is error.\n"); } else if((b==2&&iffrun(a)&&c>29)||(b==2&&(!iffrun(a))&&c>28)||((b==4||b==6||b==9||b==11)&&c>30)||c>31||c<1){printf("day is error.\n");}
文章结尾,我附上全部AC的代码,仅供参考,学术诚信:
如有错误,请斧正!
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>
#include<math.h>
#include<stdbool.h>
bool iffrun(int n)
{ if((n%4==0&&n%100!=0)||n%400==0) { return true; } return false;
}
int ifrun(int start,int end)
{ int i=0; int count=0; for(i=start;i<end;i++) { if((i%4==0&&i%100!=0)||i%400==0) { count++; } } return count;
}
int main()
{ int a,b,c; scanf("%d %d %d",&a,&b,&c); if(b>12||b<1){printf("month is error.\n"); } else if((b==2&&iffrun(a)&&c>29)||(b==2&&(!iffrun(a))&&c>28)||((b==4||b==6||b==9||b==11)&&c>30)||c>31||c<1){printf("day is error.\n");}else{int res=ifrun(1900,a); int num=365*(a-1900)+res; int i=b-1; while(i) { switch(i) { case 1:num+=31;break; case 2:num+=iffrun(a)?29:28;break; case 3:num+=31;break; case 4:num+=30;break; case 5:num+=31;break; case 6:num+=30;break; case 7:num+=31;break; case 8:num+=31;break; case 9:num+=30;break; case 10:num+=31;break; case 11:num+=30;break; case 12:num+=31;break; } i--; } num+=c-1; int k=(num+1)%7; printf("%d\n",k); }return 0; }
根据日期推算星期几——含判断日期正误相关推荐
- python判断日期是星期几_python 判断日期是星期几
%a 星期几的简写 Weekday name, abbr. %A 星期几的全称 Weekday name, full %b 月分的简写 Month name, abbr. %B 月份的全称 Month ...
- 根据日期推算星期和历法由来
太阳历和公历(儒略历与格里历) 现在世界上通用的历法--公历,有人曾似是而非地称之为"西历".其实,究其根 源,这种历法并非产生于西方,而是产生于6000多年前的古埃及. ...
- robotframework-给定日期推算星期几
前段时间有同事问我robot上有没有办法知道指定的某个日期是星期几,当时没有想起来,后来一直忙,直到现在才空下来,有时间解决一下这个问题,关于日期推算星期几,使用到泰勒公式,: 根据 蔡勒(Zelle ...
- python代码通过日期获得星期信息(根据日期获取星期day of the week)
python代码通过日期获得星期信息(根据日期获取星期day of the week) # 通过具体日期获得日期所在的星期信息 # Python program to Find day of # th ...
- js 日期比较大小,js判断日期是否在区间内,js判断时间段是否在另外一个时间段内...
/** * 日期解析,字符串转日期 * @param dateString 可以为2017-02-16,2017/02/16,2017.02.16 * @returns {Date} 返回对应的日期对 ...
- python怎么判断日期是星期几_15个日期时间计算套路,快快拿走不用谢
小伙伴们好啊,今天老祝和大家一起学习日期时间计算的套路,掌握这些套路,工作效率可以再高一点点. 1.合并日期和时间 如下图,如何将A列日期和B列的时间合并到一起,变成既有日期又带有时间的数据呢?哈哈哈 ...
- java 判断天是星期及_java判断日期是星期几的方法总结
java取得指定日期是星期几的方法:(相关视频教程推荐:java视频教程) 1.使用Calendar类//根据日期取得星期几 public static String getWeek(Date dat ...
- 判断日期是否为周末 java_java判断日期是否是周末
java判断日期是否是周末:/** * 判断是否是周末 * @return */ private boolean isWeekend(Calendar cal){ int week=cal.get(C ...
- java 由日期计算星期几_java计算日期是星期几
java取得指定日期是星期几:(推荐:java视频教程) 取得指定日期是星期几可以采用下面两种方式取得日期是星期几: 1..使用Calendar类//根据日期取得星期几 public static S ...
最新文章
- python email模块
- C# 获取并判断操作系统版本,解决Win10、 Windows Server 2012 R2 读取失败的方案
- javasript 操作option select
- Spring Cloud构建微服务架构:服务网关(路由配置)【Dalston版】
- HDFS数据恢复模式
- ASP.NET面试题 (转)
- 解决python2.7.9以下版本requests访问https的问题
- rust电器元件需要什么材料_腐蚀Rust电力系统有哪些工具 腐蚀Rust电力系统工具汇总 其他工具-游侠网...
- 课程回顾 | Xrosheart: 以太坊智能合约漏洞介绍与规模化审计方法详解(中)
- 计算机系统端口445,如何关闭445端口,教您如何关闭系统端口
- c++ 头歌实训 第四关 日历打印
- Linux交作业显示Eqw,SGE作业基本用法
- ios 开发设置左滑退出_iOS 开发UITableView左滑出现删除按钮的运用方法
- matlab 将图片制作成视频并将视频输出为图片
- 元岛屋日式烤肉,这个夏天你怎可错过!
- nginx(项目部署)linux版
- import 下划线作用
- flex通过blazeds与java实现增删改查-整个实现流程
- 正则表达式6___常用的正则表达式
- jquery绿色版dreamweaver提示