【日期】确定母亲节
母亲节是每年的五月第二个星期天,针对输入的年份,计算该年的哪一天是母亲节。
输入:
年份
输出:
日期(5月的哪一天)
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int Delta(int, int, int); //计算与1900.1.1相差几天(1900.1.1是星期一)
int run4(int); //是否为闰年,是返回1,否返回0
void main()
{
int y, m=5, d=1, delta_d, tem, ans;
scanf("%d", &y);
delta_d = Delta(y, m, d);
tem = (delta_d % 7 + 1) % 7; //到这为止程序在计算输入的年份的5.1号是星期几
switch (tem) //由于只有7种情况就直接switch了
{
case 0: ans = 8;break;
case 1: ans = 14;break;
case 2: ans = 13;break;
case 3: ans = 12;break;
case 4: ans = 11;break;
case 5: ans = 10;break;
case 6: ans = 9;break;
}
printf("%d\n", ans);
return 0;
}
int Delta(int y, int m, int d)
{
int ans = 0;
register int i;
if (y == 1900)
{
switch (m)
{
case 1: ans = d - 1;break;
case 2: ans = 30 + d;break;
case 3: ans = 58 + d;break;
case 4: ans = 89 + d;break;
case 5: ans = 119 + d;break;
case 6: ans = 150 + d;break;
case 7: ans = 180 + d;break;
case 8: ans = 211 + d;break;
case 9: ans = 242 + d;break;
case 10: ans = 272 + d;break;
case 11: ans = 303 + d;break;
case 12: ans = 333 + d;break;
}
}
else
{
for (i = 1901; i < y; i++)
{
if (run4(i))
ans = ans + 366;
else
ans = ans + 365;
}
ans += 364;
if (run4(y))
{
switch (m)
{
case 1: ans += d;break;
case 2: ans += 31 + d;break;
case 3: ans += 60 + d;break;
case 4: ans += 91 + d;break;
case 5: ans += 121 + d;break;
case 6: ans += 152 + d;break;
case 7: ans += 182 + d;break;
case 8: ans += 213 + d;break;
case 9: ans += 244 + d;break;
case 10: ans += 274 + d;break;
case 11: ans += 305 + d;break;
case 12: ans += 335 + d;break;
}
}
else
{
switch (m)
{
case 1: ans += d;break;
case 2: ans += 31 + d;break;
case 3: ans += 59 + d;break;
case 4: ans += 90 + d;break;
case 5: ans += 120 + d;break;
case 6: ans += 151 + d;break;
case 7: ans += 181 + d;break;
case 8: ans += 212 + d;break;
case 9: ans += 243 + d;break;
case 10: ans += 273 + d;break;
case 11: ans += 304 + d;break;
case 12: ans += 334 + d;break;
}
}
}
return ans;
}
int run4(int x)
{
if (x % 4 == 0 && x % 100 != 0 || x % 100 == 0 && x % 400 == 0)
return 1;
else
return 0;
}