鱼C论坛

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

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

[复制链接]
发表于 2021-10-14 13:35:44 | 显示全部楼层 |阅读模式
20鱼币
#include <stdio.h>
int main()
{
 int w,c,y,Y,m,M,d,ret;
 printf("请输入查询日期:格式为yyyy-mm-dd ");
 ret=scanf("%4d-%2d-%2d",&Y,&m,&d);
 if (ret != 3) 
  printf("请输入正确的格式!");
 else if(m>= 3 && m<= 12)
 {
  c= Y/100;
  y= Y%100;
  w= (y+y/4+c/4-2*c+26*(m+1)/10+d-1)%7;
  switch(w)
  {
   case 1: printf("%4d-%2d-%2d是星期一",Y,m,d);break;
   case 2: printf("%4d-%2d-%2d是星期二",Y,m,d);break;
   case 3: printf("%4d-%2d-%2d是星期三",Y,m,d);break;
   case 4: printf("%4d-%2d-%2d是星期四",Y,m,d);break;
   case 5: printf("%4d-%2d-%2d是星期五",Y,m,d);break;
   case 6: printf("%4d-%2d-%2d是星期六",Y,m,d);break;
   case 7: printf("%4d-%2d-%2d是星期日",Y,m,d);break;
  }
 }
问题如图,请大家帮忙指正、解答,谢谢!



微信图片_20211014133441.jpg



 else if(m == 1||m == 2)
 {
  y= (Y-1)%100;
  c= (Y/100);
  M= m+12;
  w= (y+ y/4+ c/4-2*c+ 26*(M+ 1)/10+ d-1)%7;
  switch(w)
  {
  case 1:  printf("%4d-%2d-%2d是星期一",Y,m,d);break;
  case 2:  printf("%4d-%2d-%2d是星期二",Y,m,d);break;
  case 3:  printf("%4d-%2d-%2d是星期三",Y,m,d);break;
  case 4:  printf("%4d-%2d-%2d是星期四",Y,m,d);break;
  case 5:  printf("%4d-%2d-%2d是星期五",Y,m,d);break;
  case 6:  printf("%4d-%2d-%2d是星期六",Y,m,d);break;
  case 7:  printf("%4d-%2d-%2d是星期日",Y,m,d);break;
  }
 }
 return 0;
}
最佳答案
2021-10-14 13:35:45
#include <stdio.h>
int main()
{
        int w,c,y,Y,m,d,M,ret;
        printf("请输入查询日期:格式为yyyy-mm-dd ");
        ret=scanf("%4d-%2d-%2d",&Y,&m,&d);
        if(ret != 3) 
            printf("请输入正确的格式!");
        else 
                if(m>= 3 && m<= 12)
                {
                    c= Y/100;
                    y= Y%100;
                    w= (y+y/4+c/4-(2*c)+26*(m+1)/10+d-1)%7;
                    switch(w)
                    {
                        case 0: printf("%4d-%2d-%2d是星期日",Y,m,d);break;
                        case 1: printf("%4d-%2d-%2d是星期一",Y,m,d);break;
                        case 2: printf("%4d-%2d-%2d是星期二",Y,m,d);break;
                        case 3: printf("%4d-%2d-%2d是星期三",Y,m,d);break;
                        case 4: printf("%4d-%2d-%2d是星期四",Y,m,d);break;
                        case 5: printf("%4d-%2d-%2d是星期五",Y,m,d);break;
                        case 6: printf("%4d-%2d-%2d是星期六",Y,m,d);break;
                    }
                }
                else  if(m== 1|| m== 2)
                {
                    M= m+12;
                    y= (Y-1)%100;
                        c= (Y-1)/100;
                    w= (y+ y/4+ c/4-(2*c)+ 26*(M+ 1)/10+ d-1)%7;
                    switch(w)
                    {
                            case 0:  printf("%4d-%2d-%2d是星期日",Y,m,d);break;
                        case 1:  printf("%4d-%2d-%2d是星期一",Y,m,d);break;
                        case 2:  printf("%4d-%2d-%2d是星期二",Y,m,d);break;
                        case 3:  printf("%4d-%2d-%2d是星期三",Y,m,d);break;
                        case 4:  printf("%4d-%2d-%2d是星期四",Y,m,d);break;
                        case 5:  printf("%4d-%2d-%2d是星期五",Y,m,d);break;
                        case 6:  printf("%4d-%2d-%2d是星期六",Y,m,d);break;
                    }
                }
         return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-10-14 13:35:45 | 显示全部楼层    本楼为最佳答案   
#include <stdio.h>
int main()
{
        int w,c,y,Y,m,d,M,ret;
        printf("请输入查询日期:格式为yyyy-mm-dd ");
        ret=scanf("%4d-%2d-%2d",&Y,&m,&d);
        if(ret != 3) 
            printf("请输入正确的格式!");
        else 
                if(m>= 3 && m<= 12)
                {
                    c= Y/100;
                    y= Y%100;
                    w= (y+y/4+c/4-(2*c)+26*(m+1)/10+d-1)%7;
                    switch(w)
                    {
                        case 0: printf("%4d-%2d-%2d是星期日",Y,m,d);break;
                        case 1: printf("%4d-%2d-%2d是星期一",Y,m,d);break;
                        case 2: printf("%4d-%2d-%2d是星期二",Y,m,d);break;
                        case 3: printf("%4d-%2d-%2d是星期三",Y,m,d);break;
                        case 4: printf("%4d-%2d-%2d是星期四",Y,m,d);break;
                        case 5: printf("%4d-%2d-%2d是星期五",Y,m,d);break;
                        case 6: printf("%4d-%2d-%2d是星期六",Y,m,d);break;
                    }
                }
                else  if(m== 1|| m== 2)
                {
                    M= m+12;
                    y= (Y-1)%100;
                        c= (Y-1)/100;
                    w= (y+ y/4+ c/4-(2*c)+ 26*(M+ 1)/10+ d-1)%7;
                    switch(w)
                    {
                            case 0:  printf("%4d-%2d-%2d是星期日",Y,m,d);break;
                        case 1:  printf("%4d-%2d-%2d是星期一",Y,m,d);break;
                        case 2:  printf("%4d-%2d-%2d是星期二",Y,m,d);break;
                        case 3:  printf("%4d-%2d-%2d是星期三",Y,m,d);break;
                        case 4:  printf("%4d-%2d-%2d是星期四",Y,m,d);break;
                        case 5:  printf("%4d-%2d-%2d是星期五",Y,m,d);break;
                        case 6:  printf("%4d-%2d-%2d是星期六",Y,m,d);break;
                    }
                }
         return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-10-14 17:51:30 | 显示全部楼层
推荐用map或者list,数组也行
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

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

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

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

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

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

if __name__ == "__main__":
    main()
输入/输出:
2021-10-14
星期四
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

能就我的代码进行更改吗?答案网上很多哈哈
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

400年一轮回,我查了一下2000年1月1日是星期六
int main()
{
        int w,y,Y,m,d,ret;
        int month[12]={31,28, 31,30, 31, 30 ,31 ,31 ,30 ,31, 30 ,31};
        printf("请输入查询日期:格式为yyyy-mm-dd ");
        ret=scanf("%4d-%2d-%2d",&Y,&m,&d);
        if (ret != 3)
                printf("请输入正确的格式!");
        else
        {
                y=Y%400;
                int daynum=y/4*(365*4+1)+y%4*365+(y%4?1:0)-(y-1)/100;
                for (int i = 1; i < m; i++)
                {
                        daynum+=month[i-1];
                }
                if ((0==Y%4)&&(Y%100)&&(m>3))
                {
                        daynum++;
                }
                daynum+=d;
                
                w=((daynum-1)%7+6)%7;
                switch(w)
                {
                case 0:  printf("%4d-%2d-%2d是星期日",Y,m,d);break;
                case 1:  printf("%4d-%2d-%2d是星期一",Y,m,d);break;
                case 2:  printf("%4d-%2d-%2d是星期二",Y,m,d);break;
                case 3:  printf("%4d-%2d-%2d是星期三",Y,m,d);break;
                case 4:  printf("%4d-%2d-%2d是星期四",Y,m,d);break;
                case 5:  printf("%4d-%2d-%2d是星期五",Y,m,d);break;
                case 6:  printf("%4d-%2d-%2d是星期六",Y,m,d);break;

                }
        }
        return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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


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

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

使用道具 举报

发表于 2021-10-14 21:25:20 | 显示全部楼层
鱼币
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-10-15 13:18:58 | 显示全部楼层
今天是 星期五
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

可我的是2100.1.1阿?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

意思就是用你的代码输入 2000-1-1 输出不是星期六!(和 2100-1-1 无关)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-10-15 19:45:32 | 显示全部楼层
有没有dalao能详细就我的问题进行讲解?我能多给10个渔币!!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

谢谢,但是能指出我错在哪以及解决我的疑问吗?可以的话设你为最佳了哦
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

去骂基督教为什么把耶稣诞生那年设为1年而不是零年,再骂教皇格雷戈里十三世为什么把1582年10月5日至14日之间的10天弄没了?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-9-22 15:32

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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