C语言:求星期几(求讲解)

从键盘上输入任一天日期,格式为:yyyy-mm-dd,如“2004-4-12”,编程求出改天是星期几。
程序如下:
#include<stdio.h>
int main()
{
int y, m, d;
scanf("%d-%d-%d", &y,&m,&d);
if(3 > m)
{
m+= 12;
y--;
}
printf("星期 %d", (d+2*m+3*(m+1)/5+y+y/4-y/100+y/400)%7+1);
return 0;
请求讲解(尤其是第11行中的算式)

如何求某一天是星期几? 请注意这样一个事实,即从公元元年一月一日开始到现在,每一天都是连续的,而每个星期有7天,也是连续的,也就是说日期和星期是一对一的,没有断档现象。我的基本思想是计算出当前天是从公元元年一月一日开始的第几天,再利用星期的周期性来计算公元任何一天是星期几。 假设当前年份为y,并忽略闰年,则从公元元年一月一日到y-1年共有365*(y-1)天,加上闰年多出来的天数,即加上1*((y-1)/4-(y-1)/100+(y-1)/400),"/"为整除,得:365*(y-1)+((y-1)/4-(y-1)/100+(y-1)/400)。我们再补上从当前1月1日开始到当前天的天数e,即为所求。即:365*(y-1)+((y-1)/4-(y-1)/100+(y-1)/400)+e。它的值即为当前天是从公元元年一月一日开始算起的第几天。补上一个x(x是与公元元年一月一日是星期几有关的一个0~6的整数),并将这个表达式赋给变量t,即:t=x+365*(y-1)+((y-1)/4-(y-1)/100+(y-1)/400)+e再用t除以7,余几即为星期几(余0为星期日)。 下面讨论x的求法,如果知道公元元年一月一日是星期几,就可以直接得到x的值,但现在公式还没有求出来,不知道公元元年一月一日是星期几。不过没关系,毕竟知道最近的日期是星期几。不妨看一下2001年1月1日是星期几,结果是星期一,代入公式得t=x+730516,用730516除以7,得104355,余数是1,则为了保证2001年1月1日是星期一,取x 为0,所以公元元年一月一日也是星期一。至此,得到了完整的公式: t=365*(y-1)+((y-1)/4-(y-1)/100+(y-1)/400)+e 再将它做一下改进,我们将公式变形为: t=(52*7+1)*(y-1)+((y-1)/4-(y-1)/100+(y-1)/400)+e 利用星期的周期性,将52*7+1从公式中删除,得: t=(y-1)+((y-1)/4-(y-1)/100+(y-1)/400)+e 在我百度到的那个帖子找到了答案~~ http://zhidao.baidu.com/question/3696267.html
温馨提示:答案为网友推荐,仅供参考
第1个回答  2013-07-26
11行的输出语句是吗~~首先你需要了解润年的算法~~~能被4整除的年份是闰年~其中能被100整除的又不是闰年~~再其中能被400整除的又是闰年~~而11行的算术式是利用星期数在数学运算上的规律得到的巧妙算术式~~~对于编程技巧来说没什么太多的可学之处~~以公园0年为基准365/7=52 余一天y年就多出y天其中有y/4-y/100+y/400年是闰年 这些年余两天而我们在Y年中已经算成只余一天~~所以y+y/4-y/100+y/400就是当年多出来的天数再看月份的计算31=4 余3天如果mhttp://www.chinaunix.net/jh/4/646597.html</A> 公元元年的第一天,也就是公元1年1月1日。具体:公元1年1月1日是星期六。 我晕~原来第一天不是星期1~~是星期6~~难怪算出来多了6天~~于是乎2月的情况是对的~~由于本人临时有点事~~而且也不想再算这么无聊的东西了~~都是学编程的~研究这些个东西干什么~~不属于编程技巧~~~大可以用其他的方法来实现~比如随便从日历上找一个基准点做星期号~~然后计算输入的年份和基准年份相差的日期~~而且可以给每个月的天数建立一个数组~~拿月份当下标~~这样很快能查找到当月的天数~~如果是闰年再把总天数+1方便多了~~弄个一整条乱七八糟的计算式~~不研究了~~洗衣服去~~
第2个回答  推荐于2018-04-21
基姆拉尔森计算公式

这个公式名称是我给命名的,哈哈希望大家不要见怪。

W= (d+2*m+3*(m+1)/5+y+y/4-y/100+y/400) mod 7

在公式中d表示日期中的日数,m表示月份数,y表示年数。

注意:在公式中有个与其他公式不同的地方:

把一月和二月看成是上一年的十三月和十四月,例:如果是2004-1-10则换算成:2003-13-10来代入公式计算。本回答被网友采纳
第3个回答  2013-07-26
int main(void)
{
int year, month, day, week;
printf("Year: ");
scanf("%d", &year);
printf("Month: ");
scanf("%d", &month);
printf("Day: ");
scanf("%d", &day);

if(3 > month)
{
month += 12;
year--;
}

week = (day + 2*month+3*(month+1)/5+year+year/4-year/100+year/400)%7;
printf("星期 %d", week);
}
相似回答