waixiong 发表于 2021-10-14 13:35:44

“今天是星期几?”

#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;
}
}
问题如图,请大家帮忙指正、解答,谢谢!

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;
                  }
                }
                elseif(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;
}

2736946915 发表于 2021-10-14 17:51:30

推荐用map或者list,数组也行

傻眼貓咪 发表于 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 = {"星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六"};
    printf("%s", days);
    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)) if month > 2 else int(str(year-1))
    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

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

if __name__ == "__main__":
    main()输入/输出:2021-10-14
星期四

waixiong 发表于 2021-10-14 20:42:57

傻眼貓咪 发表于 2021-10-14 19:03
蔡勒公式 Zeller's Congruence
C 代码:Python 代码:输入/输出:

能就我的代码进行更改吗?答案网上很多哈哈

jhq999 发表于 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={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;
                }
                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;
}

傻眼貓咪 发表于 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;
      }
    }
}

侯辉洋 发表于 2021-10-14 21:25:20

鱼币

LuLD 发表于 2021-10-15 13:18:58

今天是 星期五{:9_217:}

waixiong 发表于 2021-10-15 15:00:02

jhq999 发表于 2021-10-14 20:43
400年一轮回,我查了一下2000年1月1日是星期六

可我的是2100.1.1阿?

傻眼貓咪 发表于 2021-10-15 15:24:42

waixiong 发表于 2021-10-15 15:00
可我的是2100.1.1阿?

意思就是用你的代码输入 2000-1-1 输出不是星期六!(和 2100-1-1 无关)

waixiong 发表于 2021-10-15 19:45:32

有没有dalao能详细就我的问题进行讲解?我能多给10个渔币!!!{:10_266:}

waixiong 发表于 2021-10-15 20:22:13

jhq999 发表于 2021-10-14 20:43
400年一轮回,我查了一下2000年1月1日是星期六

谢谢,但是能指出我错在哪以及解决我的疑问吗?可以的话设你为最佳了哦

waixiong 发表于 2021-10-17 10:16:53

LuLD 发表于 2021-10-15 13:18
今天是 星期五

{:10_258:}

jhq999 发表于 2021-10-17 11:02:28

waixiong 发表于 2021-10-17 10:16


去骂基督教为什么把耶稣诞生那年设为1年而不是零年,再骂教皇格雷戈里十三世为什么把1582年10月5日至14日之间的10天弄没了?{:5_109:}
页: [1]
查看完整版本: “今天是星期几?”