鱼C论坛

 找回密码
 立即注册
查看: 2843|回复: 14

[已解决]“今天是星期几?”

[复制链接]
发表于 2021-10-14 13:35:44 | 显示全部楼层 |阅读模式
20鱼币
  1. #include <stdio.h>
  2. int main()
  3. {
  4. int w,c,y,Y,m,M,d,ret;
  5. printf("请输入查询日期:格式为yyyy-mm-dd ");
  6. ret=scanf("%4d-%2d-%2d",&Y,&m,&d);
  7. if (ret != 3)
  8.   printf("请输入正确的格式!");
  9. else if(m>= 3 && m<= 12)
  10. {
  11.   c= Y/100;
  12.   y= Y%100;
  13.   w= (y+y/4+c/4-2*c+26*(m+1)/10+d-1)%7;
  14.   switch(w)
  15.   {
  16.    case 1: printf("%4d-%2d-%2d是星期一",Y,m,d);break;
  17.    case 2: printf("%4d-%2d-%2d是星期二",Y,m,d);break;
  18.    case 3: printf("%4d-%2d-%2d是星期三",Y,m,d);break;
  19.    case 4: printf("%4d-%2d-%2d是星期四",Y,m,d);break;
  20.    case 5: printf("%4d-%2d-%2d是星期五",Y,m,d);break;
  21.    case 6: printf("%4d-%2d-%2d是星期六",Y,m,d);break;
  22.    case 7: printf("%4d-%2d-%2d是星期日",Y,m,d);break;
  23.   }
  24. }
  25. 问题如图,请大家帮忙指正、解答,谢谢!
  26. 微信图片_20211014133441.jpg
  27. else if(m == 1||m == 2)
  28. {
  29.   y= (Y-1)%100;
  30.   c= (Y/100);
  31.   M= m+12;
  32.   w= (y+ y/4+ c/4-2*c+ 26*(M+ 1)/10+ d-1)%7;
  33.   switch(w)
  34.   {
  35.   case 1:  printf("%4d-%2d-%2d是星期一",Y,m,d);break;
  36.   case 2:  printf("%4d-%2d-%2d是星期二",Y,m,d);break;
  37.   case 3:  printf("%4d-%2d-%2d是星期三",Y,m,d);break;
  38.   case 4:  printf("%4d-%2d-%2d是星期四",Y,m,d);break;
  39.   case 5:  printf("%4d-%2d-%2d是星期五",Y,m,d);break;
  40.   case 6:  printf("%4d-%2d-%2d是星期六",Y,m,d);break;
  41.   case 7:  printf("%4d-%2d-%2d是星期日",Y,m,d);break;
  42.   }
  43. }
  44. return 0;
  45. }
复制代码
最佳答案
2021-10-14 13:35:45
  1. #include <stdio.h>
  2. int main()
  3. {
  4.         int w,c,y,Y,m,d,M,ret;
  5.         printf("请输入查询日期:格式为yyyy-mm-dd ");
  6.         ret=scanf("%4d-%2d-%2d",&Y,&m,&d);
  7.         if(ret != 3)
  8.             printf("请输入正确的格式!");
  9.         else
  10.                 if(m>= 3 && m<= 12)
  11.                 {
  12.                     c= Y/100;
  13.                     y= Y%100;
  14.                     w= (y+y/4+c/4-(2*c)+26*(m+1)/10+d-1)%7;
  15.                     switch(w)
  16.                     {
  17.                         case 0: printf("%4d-%2d-%2d是星期日",Y,m,d);break;
  18.                         case 1: printf("%4d-%2d-%2d是星期一",Y,m,d);break;
  19.                         case 2: printf("%4d-%2d-%2d是星期二",Y,m,d);break;
  20.                         case 3: printf("%4d-%2d-%2d是星期三",Y,m,d);break;
  21.                         case 4: printf("%4d-%2d-%2d是星期四",Y,m,d);break;
  22.                         case 5: printf("%4d-%2d-%2d是星期五",Y,m,d);break;
  23.                         case 6: printf("%4d-%2d-%2d是星期六",Y,m,d);break;
  24.                     }
  25.                 }
  26.                 else  if(m== 1|| m== 2)
  27.                 {
  28.                     M= m+12;
  29.                     y= (Y-1)%100;
  30.                         c= (Y-1)/100;
  31.                     w= (y+ y/4+ c/4-(2*c)+ 26*(M+ 1)/10+ d-1)%7;
  32.                     switch(w)
  33.                     {
  34.                             case 0:  printf("%4d-%2d-%2d是星期日",Y,m,d);break;
  35.                         case 1:  printf("%4d-%2d-%2d是星期一",Y,m,d);break;
  36.                         case 2:  printf("%4d-%2d-%2d是星期二",Y,m,d);break;
  37.                         case 3:  printf("%4d-%2d-%2d是星期三",Y,m,d);break;
  38.                         case 4:  printf("%4d-%2d-%2d是星期四",Y,m,d);break;
  39.                         case 5:  printf("%4d-%2d-%2d是星期五",Y,m,d);break;
  40.                         case 6:  printf("%4d-%2d-%2d是星期六",Y,m,d);break;
  41.                     }
  42.                 }
  43.          return 0;
  44. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2021-10-14 13:35:45 | 显示全部楼层    本楼为最佳答案   
  1. #include <stdio.h>
  2. int main()
  3. {
  4.         int w,c,y,Y,m,d,M,ret;
  5.         printf("请输入查询日期:格式为yyyy-mm-dd ");
  6.         ret=scanf("%4d-%2d-%2d",&Y,&m,&d);
  7.         if(ret != 3)
  8.             printf("请输入正确的格式!");
  9.         else
  10.                 if(m>= 3 && m<= 12)
  11.                 {
  12.                     c= Y/100;
  13.                     y= Y%100;
  14.                     w= (y+y/4+c/4-(2*c)+26*(m+1)/10+d-1)%7;
  15.                     switch(w)
  16.                     {
  17.                         case 0: printf("%4d-%2d-%2d是星期日",Y,m,d);break;
  18.                         case 1: printf("%4d-%2d-%2d是星期一",Y,m,d);break;
  19.                         case 2: printf("%4d-%2d-%2d是星期二",Y,m,d);break;
  20.                         case 3: printf("%4d-%2d-%2d是星期三",Y,m,d);break;
  21.                         case 4: printf("%4d-%2d-%2d是星期四",Y,m,d);break;
  22.                         case 5: printf("%4d-%2d-%2d是星期五",Y,m,d);break;
  23.                         case 6: printf("%4d-%2d-%2d是星期六",Y,m,d);break;
  24.                     }
  25.                 }
  26.                 else  if(m== 1|| m== 2)
  27.                 {
  28.                     M= m+12;
  29.                     y= (Y-1)%100;
  30.                         c= (Y-1)/100;
  31.                     w= (y+ y/4+ c/4-(2*c)+ 26*(M+ 1)/10+ d-1)%7;
  32.                     switch(w)
  33.                     {
  34.                             case 0:  printf("%4d-%2d-%2d是星期日",Y,m,d);break;
  35.                         case 1:  printf("%4d-%2d-%2d是星期一",Y,m,d);break;
  36.                         case 2:  printf("%4d-%2d-%2d是星期二",Y,m,d);break;
  37.                         case 3:  printf("%4d-%2d-%2d是星期三",Y,m,d);break;
  38.                         case 4:  printf("%4d-%2d-%2d是星期四",Y,m,d);break;
  39.                         case 5:  printf("%4d-%2d-%2d是星期五",Y,m,d);break;
  40.                         case 6:  printf("%4d-%2d-%2d是星期六",Y,m,d);break;
  41.                     }
  42.                 }
  43.          return 0;
  44. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2021-10-14 17:51:30 | 显示全部楼层
推荐用map或者list,数组也行
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2021-10-14 19:03:07 | 显示全部楼层
本帖最后由 傻眼貓咪 于 2021-10-14 19:50 编辑

蔡勒公式 Zeller's Congruence
C 代码:
  1. #include <stdio.h>

  2. int formula(int day, int month, int year){
  3.    
  4.     int c = month > 2 ? year - (year%100)/100 : ((year-1) - (year-1)%100)/100;
  5.     int y = month > 2 ? year%100 : (year-1)%100;
  6.     int m = month < 3 ? month+12 : month;
  7.     int d = day;
  8.     int w = ((year < 1582) || (year == 1582 && month < 10) || (year == 1582 && month == 10 && day <= 4)) ?\
  9.     (y + (int)(y/4) + (int)(c/4) - (2*c) + (int)((26*(m+1))/10) + d - 1)%7 :\
  10.     (y + (int)(y/4) + (int)(c/4) - (2*c) + (2*m) + (int)((3*(m+1))/5) + d + 1)%7;
  11.     return w;
  12. }

  13. int main(){
  14.     int day, month, year;
  15.     scanf("%4d-%2d-%2d", &year, &month, &day);
  16.     char* days[7] = {"星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六"};
  17.     printf("%s", days[formula(day, month, year)]);
  18.     return 0;
  19. }
复制代码
Python 代码:
  1. def formula(day, month, year):
  2.     """
  3.     蔡勒公式 Zeller's congruence
  4.     1582年 10月 4日 之前:w = (y + int(y/4) + int(c/4) - (2*c) + int((26*(m+1))/10) + d - 1)%7
  5.     1582年 10月 4日 之后:w = (y + int(y/4) + int(c/4) - (2*c) + (2*m) + int((3*(m+1))/5) + d + 1)%7

  6.     w:星期(計算所得的數值對應的星期:0-星期日;1-星期一;2-星期二;3-星期三;4-星期四;5-星期五;6-星期六)
  7.     c:年份前兩位數
  8.     y:年份後兩位數
  9.     m:月(m的取值範圍為3至14,即在蔡勒公式中,某年的1、2月要看作上一年的13、14月來計算,比如2003年1月1日要看作2002年的13月1日來計算)
  10.     d:日
  11.     """
  12.     days = {0: "星期日", 1: "星期一", 2: "星期二", 3: "星期三", 4: "星期四", 5: "星期五", 6: "星期六"}
  13.     c = int(str(year)[:2]) if month > 2 else int(str(year-1)[:2])
  14.     y = int(str(year)[2:]) if month > 2 else int(str(year-1)[2:])
  15.     m = month+12 if month < 3 else month
  16.     d = day
  17.     w = (y + int(y/4) + int(c/4) - (2*c) + int((26*(m+1))/10) + d - 1)%7 if (year < 1582) or (year == 1582 and month < 10) or (year == 1582 and month == 10 and day <= 4)\
  18.         else (y + int(y/4) + int(c/4) - (2*c) + (2*m) + int((3*(m+1))/5) + d + 1)%7
  19.     return days[w]

  20. def main():
  21.     year, month, day = map(int, input().split("-"))
  22.     print(f"{formula(day, month, year)}")

  23. if __name__ == "__main__":
  24.     main()
复制代码
输入/输出:
  1. 2021-10-14
  2. 星期四
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-10-14 20:42:57 | 显示全部楼层
傻眼貓咪 发表于 2021-10-14 19:03
蔡勒公式 Zeller's Congruence
C 代码:Python 代码:输入/输出:

能就我的代码进行更改吗?答案网上很多哈哈
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2021-10-14 20:43:31 | 显示全部楼层
本帖最后由 jhq999 于 2021-10-14 21:09 编辑

400年一轮回,我查了一下2000年1月1日是星期六
  1. int main()
  2. {
  3.         int w,y,Y,m,d,ret;
  4.         int month[12]={31,28, 31,30, 31, 30 ,31 ,31 ,30 ,31, 30 ,31};
  5.         printf("请输入查询日期:格式为yyyy-mm-dd ");
  6.         ret=scanf("%4d-%2d-%2d",&Y,&m,&d);
  7.         if (ret != 3)
  8.                 printf("请输入正确的格式!");
  9.         else
  10.         {
  11.                 y=Y%400;
  12.                 int daynum=y/4*(365*4+1)+y%4*365+(y%4?1:0)-(y-1)/100;
  13.                 for (int i = 1; i < m; i++)
  14.                 {
  15.                         daynum+=month[i-1];
  16.                 }
  17.                 if ((0==Y%4)&&(Y%100)&&(m>3))
  18.                 {
  19.                         daynum++;
  20.                 }
  21.                 daynum+=d;
  22.                
  23.                 w=((daynum-1)%7+6)%7;
  24.                 switch(w)
  25.                 {
  26.                 case 0:  printf("%4d-%2d-%2d是星期日",Y,m,d);break;
  27.                 case 1:  printf("%4d-%2d-%2d是星期一",Y,m,d);break;
  28.                 case 2:  printf("%4d-%2d-%2d是星期二",Y,m,d);break;
  29.                 case 3:  printf("%4d-%2d-%2d是星期三",Y,m,d);break;
  30.                 case 4:  printf("%4d-%2d-%2d是星期四",Y,m,d);break;
  31.                 case 5:  printf("%4d-%2d-%2d是星期五",Y,m,d);break;
  32.                 case 6:  printf("%4d-%2d-%2d是星期六",Y,m,d);break;

  33.                 }
  34.         }
  35.         return 0;
  36. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2021-10-14 21:14:02 | 显示全部楼层
本帖最后由 傻眼貓咪 于 2021-10-14 21:19 编辑
waixiong 发表于 2021-10-14 20:42
能就我的代码进行更改吗?答案网上很多哈哈


针对你的代码做改进但还是不能完善,如 5楼 所说,你的代码不齐全,2000年1月1日 是星期六。所以为什么我重写代码,以下是你的代码(不完善)
  1. #include <stdio.h>

  2. int main(){
  3.     int w, c, y, Y, m, M, d, ret;
  4.     printf("请输入查询日期:格式为yyyy-mm-dd ");
  5.     ret = scanf("%4d-%2d-%2d",&Y,&m,&d);
  6.     if (ret != 3)
  7.       printf("请输入正确的格式!");
  8.     else{
  9.         c = m > 2 ? Y/100 : (Y-1)/100; // 这里只需用 ? : 判断符就可以省略重复多行代码
  10.         y = m > 2 ? Y%100 : (Y-1)/100; // 如上
  11.         m = m > 2 ? m : m+12; // 如上
  12.         w = (y + (y/4) + (c/4) - (2*c) + ((26*(m+1))/10) + d - 1)%7; // 可以用括号就用括号,不然系统会以运算符优先级做运算,答案会有错
  13.         switch(w){
  14.             case 0: printf("%4d-%2d-%2d是星期日", Y, m, d);break; // case 0 才是正确输出星期日(不是 case 7)
  15.             case 1: printf("%4d-%2d-%2d是星期一", Y, m ,d);break;
  16.             case 2: printf("%4d-%2d-%2d是星期二", Y, m, d);break;
  17.             case 3: printf("%4d-%2d-%2d是星期三", Y, m, d);break;
  18.             case 4: printf("%4d-%2d-%2d是星期四", Y, m, d);break;
  19.             case 5: printf("%4d-%2d-%2d是星期五", Y, m, d);break;
  20.             case 6: printf("%4d-%2d-%2d是星期六", Y, m, d);break;
  21.         }
  22.     }
  23. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2021-10-14 21:25:20 | 显示全部楼层
鱼币
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2021-10-15 13:18:58 | 显示全部楼层
今天是 星期五
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-10-15 15:00:02 | 显示全部楼层
jhq999 发表于 2021-10-14 20:43
400年一轮回,我查了一下2000年1月1日是星期六

可我的是2100.1.1阿?
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2021-10-15 15:24:42 | 显示全部楼层
waixiong 发表于 2021-10-15 15:00
可我的是2100.1.1阿?

意思就是用你的代码输入 2000-1-1 输出不是星期六!(和 2100-1-1 无关)
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-10-15 19:45:32 | 显示全部楼层
有没有dalao能详细就我的问题进行讲解?我能多给10个渔币!!!
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-10-15 20:22:13 | 显示全部楼层
jhq999 发表于 2021-10-14 20:43
400年一轮回,我查了一下2000年1月1日是星期六

谢谢,但是能指出我错在哪以及解决我的疑问吗?可以的话设你为最佳了哦
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-10-17 10:16:53 | 显示全部楼层

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2021-10-17 11:02:28 | 显示全部楼层

去骂基督教为什么把耶稣诞生那年设为1年而不是零年,再骂教皇格雷戈里十三世为什么把1582年10月5日至14日之间的10天弄没了?
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-4-26 00:45

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表