【输入】 一行,3个以空格分隔的整数 y、m、d,分别为年、月、日,满足1900 ≤ y ≤ 9999,且是一个合法日期
【输出】 一行,表示星期的英文字符串,周日到周六分别为 Sunday、Monday、Tuesday、Wednesday、Thursday、Friday、Saturday
【样例输入】 2019 1 4
【样例输出】 Friday
辛苦说下大致思路以及代码。
#include<stdio.h>
int main()
{
int y,m,d,n;
int a[13],i,sum1,sum2,sum;
scanf("%d%d%d",&y,&m,&d);
sum1=0;sum2=d;sum=0;
for(i=1900;i<y;i++)
{
if(i%4==0&&i%100!=0||i%400==0)
n=366;
else n=365;
sum1=sum1+n; //每年天数和
}
if(y%4==0&&y%100!=0||y%400==0)
a[2]=29;
else a[2]=28;
for(i=1;i<=12;i++)
if(i==1||i==3||i==5||i==7||i==8||i==10||i==12)
a[i]=31;
else if(i==4||i==6||i==9||i==11)
a[i]=30;
for(i=1;i<m;i++) //每月天数和
sum2=sum2+a[i];
sum=sum1+sum2;
switch(sum%7)
{
case 0:printf("Sunday\n");break;
case 1:printf("Monday\n");break;
case 2:printf("Tuesday\n");break;
case 3:printf("Wednesday\n");break;
case 4:printf("Thusday\n");break;
case 5:printf("Friday\n");break;
case 6:printf("Saturday\n");break;
default:break;
}
}
简单的来说,我们对于月份的题目就是来处理他的年(闰年和平年)月(2月和哪一些31天哪一些30天)
而这题目,就是看他的总共天数 总天数=年+月+日
年:
我们从1900年开始,只要年份加1,那么他的天数就是+365或者+366,用一个for来计算,累加
好啦,之后就是我们的月份了,因为像2020.9.7,他一年还没有过完,所以我们来看月份
月:
只要月份加1,就是+28,+30,+31一个条件判断,也是累加
日:
再把我们的天数算上去
总天数%7,来求余数,再通过之前的信息来推就可以啦
蔡勒公式,供参考:
#include <stdio.h>
int main()
{
int year, m, d, w, y, c;
char Week[][10] = { "Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday" };
scanf("%d %d %d", &year, &m, &d);
y = year % 100;
c = year / 100;
if (m == 1 || m == 2) {
m += 12; y--;
}
w = (y + y / 4 + c / 4 - 2 * c + 26 * (m + 1) / 10 + d - 1) % 7;
w = w >= 0 ? w : (7 + w);
printf("%s", Week[w]);
return 0;
}