“今天是星期几?”
#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;
} #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;
} 推荐用map或者list,数组也行 本帖最后由 傻眼貓咪 于 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
星期四 傻眼貓咪 发表于 2021-10-14 19:03
蔡勒公式 Zeller's Congruence
C 代码:Python 代码:输入/输出:
能就我的代码进行更改吗?答案网上很多哈哈 本帖最后由 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: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;
}
}
} 鱼币 今天是 星期五{:9_217:} jhq999 发表于 2021-10-14 20:43
400年一轮回,我查了一下2000年1月1日是星期六
可我的是2100.1.1阿? waixiong 发表于 2021-10-15 15:00
可我的是2100.1.1阿?
意思就是用你的代码输入 2000-1-1 输出不是星期六!(和 2100-1-1 无关) 有没有dalao能详细就我的问题进行讲解?我能多给10个渔币!!!{:10_266:} jhq999 发表于 2021-10-14 20:43
400年一轮回,我查了一下2000年1月1日是星期六
谢谢,但是能指出我错在哪以及解决我的疑问吗?可以的话设你为最佳了哦 LuLD 发表于 2021-10-15 13:18
今天是 星期五
{:10_258:} waixiong 发表于 2021-10-17 10:16
去骂基督教为什么把耶稣诞生那年设为1年而不是零年,再骂教皇格雷戈里十三世为什么把1582年10月5日至14日之间的10天弄没了?{:5_109:}
页:
[1]