C语言 根据日期求星期

w770264484 2017-12-12 11:09:48
任意给出一个年月日,求出是星期几。

输入:

年 月 日

输出:

0~6。
星期日用 0 表示,星期一用 1 表示,星期二用 2 表示......星期六用 6 表示。

我写的代码:
#include<stdio.h>
int main()
{
int n,y,r,a,x,m,d,e;
scanf("%d %d %d",&n,&y,&r);
x=0;
m=0;
if(n%400==0 || n%100!=0 && n%4==0) {x+=1;m=1;
}
if(m=1)
switch(y)
{
case 1:a=(n-1900)*365+x+r-1;break;
case 2:a=(n-1900)*365+x+31+r-1;break;
case 3:a=(n-1900)*365+x+60+r-1;break;
case 4:a=(n-1900)*365+x+91+r-1;break;
case 5:a=(n-1900)*365+x+121+r-1;break;
case 6:a=(n-1900)*365+x+152+r-1;break;
case 7:a=(n-1900)*365+x+182+r-1;break;
case 8:a=(n-1900)*365+x+213+r-1;break;
case 9:a=(n-1900)*365+x+244+r-1;break;
case 10:a=(n-1900)*365+x+274+r-1;break;
case 11:a=(n-1900)*365+x+305+r-1;break;
case 12:a=(n-1900)*365+x+335+r-1;break;}
else
{
switch(y)
{
case 1:a=(n-1900)*365+x+r-1;break;
case 2:a=(n-1900)*365+x+31+r-1;break;
case 3:a=(n-1900)*365+x+59+r-1;break;
case 4:a=(n-1900)*365+x+90+r-1;break;
case 5:a=(n-1900)*365+x+120+r-1;break;
case 6:a=(n-1900)*365+x+151+r-1;break;
case 7:a=(n-1900)*365+x+181+r-1;break;
case 8:a=(n-1900)*365+x+212+r-1;break;
case 9:a=(n-1900)*365+x+243+r-1;break;
case 10:a=(n-1900)*365+x+273+r-1;break;
case 11:a=(n-1900)*365+x+304+r-1;break;
case 12:a=(n-1900)*365+x+334+r-1;break;}
}
d=a%7;
printf("%d",d);
return 0;


}
问题:最后 d=a%7;
printf("%d",d);
是我根据正确答案试出来的 但是我并不明白为什么星期直接等于总共的天数%7
求解
...全文
1103 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
636f6c696e 2019-07-18
  • 打赏
  • 举报
回复
然后呢?用if的目的在于什么?一坨垃圾袋吗么?
引用 2 楼 weixin_45047844 的回复:
if(m=1)这样写是可以的,这是个赋值运算符,
select6 2019-07-18
  • 打赏
  • 举报
回复
if(m=1)这样写是可以的,这是个赋值运算符,
自信男孩 2017-12-13
  • 打赏
  • 举报
回复
因为天数对7取余,商是当前的星期日期向后星期数。余数是当前星期日期需要加的天数。当前星期日期加上余数就是某年某月某日是星期几了。 代码有个问题,就是将if中的判断表达式写成赋值表达式,如下:
 if(m == 1)    /*应该是这样的*/
        switch(y)
另外,代码有冗余,用一个switch case即可。建议改一下,因为对于闰年和非闰年,二月份只差1天,没必要用两个switch case;判断一下月份若大于2,多加一天即可。

69,369

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧