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

输入年月日判断星期几C语言版-附带讲解 如何通过C语言输入年月日判断星期几-附带讲解 阅读详情

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

Box2D-Lite源码阅读笔记(2) 0.初始化函数 static void InitDemo(int index) { world.Clear(); numBodies = 0; numJoints = 0; bomb = NULL; demoIndex = index; demos[index](bodies, joints); } 在这个初始化函数中,一般会默认执行index=0的函数,这个函数就是一个示例,因为示例比较简单,所以也便于研究,示例效果如下。 就是一个方块。 进入第一个示例函数。(忽略我加的注释) 阅读详情

相关推荐

视频生成工具本地部署完全指南:Seedance能装吗?有哪些开源替代?

本文系统介绍了视频生成模型的本地部署方案,分为三个部分:1)Seedance 2.0的混合部署模式,其开源组件可本地集成但核心功能需调用API;2)完全开源替代方案对比,包括LTX-2、Wan 2.1等模型的硬件需求与特点;3)详细部署指南,以ComfyUI+Wan 2.1为例,涵盖软件准备、模型整合、参数调优等步骤,并提供了显存优化和多GPU配置技巧。文章为需要离线视频生成能力的用户提供了完整技术路径。

小明的博客 1万+

C/C++【日期】再算星期(选做)

19.【日期】再算星期(选做) 再次给出任意一个年月日(年>1900),现在我们不能只是直接计算,要先判断给出的日期是否合法,对于非法的日期要给出错误提示信息,合法的日期要再计算是星期几。 输入: 年 月 日 输出: 0~6。 星期日用 0 表示,星期一用 1 表示,星期二用 2 表示......星期六用 6 表示。 假设年份大于1900。先想一想:我们现在只会使用 if 语句,该如何建立数学模型? #include <stdio.h> #include <stdlib.h&gt

SPSITA 2981

U3d WebGL使用ToLua

首先我们在编辑器模式下加入Tolua插件,然后配置修改到在编辑器模式下能够正常的运行。 同个U3d 插件Build出WebGL的工程,运行的时候你会发现(有些需要把这个WebGL工程放在一个HttpServer下面,直接本地访问index.html会被拒绝,让你使用http的格式)。 当要加载完的时候会出现 To use dlopen, you need to use Emscripten'...

qq_35267906的博客 2948

c语言编程输入年月日判断是否合法,c语言年月日计算再次给出任意一个年月日(年>1900),现在我们不能只是直接计算,要先判断给出的日期是否合法,对于非法的日期要给出错误提示信息,合法的日期要再计算是星...

c语言年月日计算再次给出任意一个年月日(年>1900),现在我们不能只是直接计算,要先判断给出的日期是否合法,对于非法的日期要给出错误提示信息,合法的日期要再计算是星期几.输入:年2017-01-13c语言年月日计算再次给出任意一个年月日(年>1900),现在我们不能只是直接计算,要先判断给出的日期是否合法,对于非法的日期要给出错误提示信息,合法的日期要再计算是星期几.输入:年 月 日...

weixin_28943467的博客 1644

深入解析反射式DLL注入:从原理到实战优化

本文深入解析反射式DLL注入技术,从原理到实战优化全面剖析。通过PE文件内存重构、反射加载器实现及免杀增强方案,展示如何绕过安全检测并提升性能。适用于红队行动、内网渗透等场景,是高级攻防对抗中的关键技术。

weixin_28339967的博客 405

SAP CO-PA数据传送避坑指南:销售开票与FI/MM记账的日常配置实操(含KEKF/KE4I/KEI2)

本文深入解析SAP CO-PA数据传送中的常见配置问题,特别是销售开票与FI/MM记账环节的实操避坑指南。通过KEKF/KE4I/KEI2等关键配置点的详细说明,帮助用户避免数据失真和重复记录,提升获利能力分析的准确性。文章结合实战案例,揭示官方文档未提及的'数据黑洞'形成机制,为SAP顾问提供实用的排雷手册。

weixin_26905487的博客 391

【C语言编程基础】根据日期求星期(基姆拉尔森计算公式)

星期日用 0 表示,星期一用 1 表示,星期二用 2 表示......星期六用 6 表示。在公式中d表示日期中的日数,m表示月份数,y表示年数,%表示取余。注:当输入1月和2月时,需要当作前一年的13月和14月。是0~6,0代表星期日,1~6星期一到星期六。任意给出一个年月日,求出是星期几。初学请谅解,大家多提建议。

2301_76914828的博客 6808

libiec61850实战:手把手教你用C语言动态获取IED设备模型(附完整代码解析)

本文详细介绍了如何使用libiec61850库通过C语言动态获取IED设备模型,包括环境配置、连接建立、模型遍历及错误处理等关键步骤。通过完整的代码示例和实战案例,帮助开发者掌握智能变电站通信中的核心技术,提升工业自动化系统的开发效率。

weixin_42519985的博客 434

【日期】根据日期求星期

任意给出一个年月日,求出是星期几。

CharlesHsuu的博客 3527

Vue3 + 高德地图实现车辆电子围栏监控与报警

通过本文的实现,我们完成了一个通用的车辆电子围栏监控功能:支持多种围栏类型。支持进入/离开/双向报警。使用缓存机制避免重复告警。可与Vue3 + 高德地图无缝集成。在实际项目中,可以结合WebSocket 实时定位,实现车辆的实时监控 + 围栏告警系统🚀。

专注于前端开发与实战技巧,记录从零到一的学习与项目经验。分享 Vue3 / JavaScript / TypeScript / Flutter /Uniapp等前端技术,以及 性能优化、工程化、最佳实践。 1035

【华为OD机试真题】141、租车骑绿岛 | 机试真题+思路参考+代码解析(C++、Java、Py、C语言、JS)

题目描述 >部门组织绿岛骑行团建活动。租用公共双人自行车,每辆自行车最多坐两人,最大载重M。 给出部门每个人的体重,请问最多需要租用多少双人自行车。

KJ.JK 1961

【日期】再算星期

再次给出任意一个年月日(年>1900),现在我们不能只是直接计算,要先判断给出的日期是否合法,对于非法的日期要给出错误提示信息,合法的日期要再计算是星期几。

CharlesHsuu的博客 1104

高通拨号流程介绍

本文介绍了高通平台(如SDX55)中APSS(A7处理器)与ModEM(Q6处理器)间的通信机制。

四儿家的小祖宗的博客 1068

12.【日期】再算星期——处理非法输入【北理工乐学C语言作业】

再次给出任意一个年月日(年>1900),现在我们不能只是直接计算,要先判断给出的日期是否合法,对于非法的日期要给出错误提示信息,合法的日期要再计算是星期几。星期日用 0 表示,星期一用 1 表示,星期二用 2 表示......星期六用 6 表示。假设年份大于1900。想一想,只使 if 语句(

blhqqqqq的博客 725

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

暑假学习打卡【4】——北理工乐学第四周作业

北理工乐学第四周作业

qq_42907586的博客 2776

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

求合法年月日 /新手

#include  //给出任意一个年月日(年>1900),现在我们不能只是直接计算,要先判断给出的日期是否合法,对于非 int main()         //法的日期要给出错误提示信息,合法的日期要再计算是星期几。 { int year,month,day,n,s=0,day1; scanf("%d %d %d",&year,&month,&day); if(year>=1900)

qq398189493_的博客 1191

根据年月日计算星期几的函数

大部分日期计算正常, 2014-04-01 (星期2)计算出来的星期不正确。 原因:计算出来的 w可能出现负值, 求负数的余数需要特殊处理,需要按数论的计算方式求余数。网上很多代码存在此问题,少数日期计算不正确。 解决:负数先转为正数求余,然后求补 /* *********************************************************************

minyuanxiani的专栏 5779

随机输入日期计算星期几(1900年1月1日为基础)

已知,1900年1月1日是星期1,用户随机输入年月日,计算星期几 第一版,纯python基础代码实现 1 year=int(input('year'))2 month=int(input('month')) 3 day=int(input('day')) 4 if year >=1900:#大于等于1900 5 ryear =1900 6 ...

weixin_30924239的博客 1976

北京理工大学c语言非信息,北京理工大学2013级C程序设计非信息类答案part1.doc

北京理工大学2013级C程序设计非信息类答案part1.doc下载提示(请认真阅读)1.请仔细阅读文档,确保文档完整性,对于不预览、不比对内容而直接下载带来的问题本站不予受理。2.下载的文档,不会出现我们的网址水印。3、该文档所得收入(下载+内容+预览)归上传者、原创作者;如果您是本文档原作者,请点此认领!既往收益都归您。文档包含非法信息?点此举报后获取现金奖励!下载文档到电脑,查找使用更方便20...

weixin_36460573的博客 1765

给年月日判断星期几

星期几 给定一个1900~2100范围内日期,输出这个日期是星期几。数据有多组。如使用简化公式需证明其正确性(注解形式)。 输入格式: 输入数据的数据格式为YYYY/MM/DD组成,具体参见sample input ,另外,可以向你确保所有的输入数据是合法的。 输出格式: 对于每组输入数据,输出一行,表示该日期是星期几英文单词。 输入样例: 2011/11/17 输出样例: thursday 具体的定位某年的一月一号是星期几的话有专门的科学家做过研究并总结出了很多推算方法的,这个是比较简单...

Helinshan的博客 4459

输入年月日,输出星期几

输入:年月日 输出:周几 备注:从1月1日开始算起,默认是周一。思想就是算出总的天数模7即可 ​ #include<stdio.h> //输入一个年月日 判断今天是星期几 //已知1月1日是周一 int main(){ int year,month,day,sum=0; int week,sumDay=0; int mmonth[]={31,28,31,30,31,30,31,31,30,31,30,31}; scanf("%d %d %d",&year...

记录心得,常学常新。赠人玫瑰,手留余香。 5880

计算星期

题目内容: 给出任意一个年月日(年>1900),现在我们不能只是直接计算,要先判断给出的日期是否合法,对于非法的日期要给出错误提示信息,合法的日期要再计算是星期几。 输入格式: 年 月 日 输出格式: 0~6。     星期日用 0 表示,星期一用 1 表示,星期二用 2 表示......星期六用 6 表示。 假设年份大于190

ThistleZhang 2671

根据输入的年月日,确定这一天是星期几。

根据输入的年月日,确定这一天是星期几。 法一:根据基姆拉尔森日期公式,已知年月日,可以快速的求出这一天是星期几。 基姆拉尔森日期公式如下所示: 参数说明: y 为我们输入的年; m 为我们输入的月; d 为我们输入的日。 注意:mod为取模符号。在使用时,如果遇到一月或者二月,需要把一月和二月看成是上一年的十三月和十四月。例如,如果日期是 2004-1-10 ,则需要换算成 2003-13-10, 再代入公式进行计算。 package com.jianglan.date; import java.uti

muyuxifeng的博客 6389
上一篇: 力扣刷题——可怜的小猪
下一篇: 杂题一则-最后的三位数
June_sixth
博客等级 码龄5年 31粉丝 27原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值