正好做到这一道布置的选做题,也是在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;  }  

根据日期推算星期几——含判断日期正误相关推荐

  1. python判断日期是星期几_python 判断日期是星期几

    %a 星期几的简写 Weekday name, abbr. %A 星期几的全称 Weekday name, full %b 月分的简写 Month name, abbr. %B 月份的全称 Month ...

  2. 根据日期推算星期和历法由来

    太阳历和公历(儒略历与格里历) 现在世界上通用的历法--公历,有人曾似是而非地称之为"西历".其实,究其根 源,这种历法并非产生于西方,而是产生于6000多年前的古埃及.     ...

  3. robotframework-给定日期推算星期几

    前段时间有同事问我robot上有没有办法知道指定的某个日期是星期几,当时没有想起来,后来一直忙,直到现在才空下来,有时间解决一下这个问题,关于日期推算星期几,使用到泰勒公式,: 根据 蔡勒(Zelle ...

  4. python代码通过日期获得星期信息(根据日期获取星期day of the week)

    python代码通过日期获得星期信息(根据日期获取星期day of the week) # 通过具体日期获得日期所在的星期信息 # Python program to Find day of # th ...

  5. js 日期比较大小,js判断日期是否在区间内,js判断时间段是否在另外一个时间段内...

    /** * 日期解析,字符串转日期 * @param dateString 可以为2017-02-16,2017/02/16,2017.02.16 * @returns {Date} 返回对应的日期对 ...

  6. python怎么判断日期是星期几_15个日期时间计算套路,快快拿走不用谢

    小伙伴们好啊,今天老祝和大家一起学习日期时间计算的套路,掌握这些套路,工作效率可以再高一点点. 1.合并日期和时间 如下图,如何将A列日期和B列的时间合并到一起,变成既有日期又带有时间的数据呢?哈哈哈 ...

  7. java 判断天是星期及_java判断日期是星期几的方法总结

    java取得指定日期是星期几的方法:(相关视频教程推荐:java视频教程) 1.使用Calendar类//根据日期取得星期几 public static String getWeek(Date dat ...

  8. 判断日期是否为周末 java_java判断日期是否是周末

    java判断日期是否是周末:/** * 判断是否是周末 * @return */ private boolean isWeekend(Calendar cal){ int week=cal.get(C ...

  9. java 由日期计算星期几_java计算日期是星期几

    java取得指定日期是星期几:(推荐:java视频教程) 取得指定日期是星期几可以采用下面两种方式取得日期是星期几: 1..使用Calendar类//根据日期取得星期几 public static S ...

最新文章

  1. python email模块
  2. C# 获取并判断操作系统版本,解决Win10、 Windows Server 2012 R2 读取失败的方案
  3. javasript 操作option select
  4. Spring Cloud构建微服务架构:服务网关(路由配置)【Dalston版】
  5. HDFS数据恢复模式
  6. ASP.NET面试题 (转)
  7. 解决python2.7.9以下版本requests访问https的问题
  8. rust电器元件需要什么材料_腐蚀Rust电力系统有哪些工具 腐蚀Rust电力系统工具汇总 其他工具-游侠网...
  9. 课程回顾 | Xrosheart: 以太坊智能合约漏洞介绍与规模化审计方法详解(中)
  10. 计算机系统端口445,如何关闭445端口,教您如何关闭系统端口
  11. c++ 头歌实训 第四关 日历打印
  12. Linux交作业显示Eqw,SGE作业基本用法
  13. ios 开发设置左滑退出_iOS 开发UITableView左滑出现删除按钮的运用方法
  14. matlab 将图片制作成视频并将视频输出为图片
  15. 元岛屋日式烤肉,这个夏天你怎可错过!
  16. nginx(项目部署)linux版
  17. import 下划线作用
  18. flex通过blazeds与java实现增删改查-整个实现流程
  19. 正则表达式6___常用的正则表达式
  20. jquery绿色版dreamweaver提示

热门文章

  1. sql server 全文检索 使用
  2. 微信公众号之海量资料
  3. 60.left join(左连接)
  4. CultureInfo代码和区域列表
  5. KaTex的一个简单例子
  6. MapReduce教程(01)- 初识MapReduce
  7. 一个程序员的学习历程
  8. mes系统是什么?mes系统的主要功能有哪些?
  9. BaseAdapter的notifyDataSetChanged方法
  10. HTTPS接口压测 --- hey工具