由年月日计算该日是星期几

小明很羡慕那些算命的江湖骗子,因为他们可以看你一眼就知道你的前世今生。
当然,我们知道那些骗子都是察言观色的胡诌。但我们可以帮助小明写一个程序,
算出一个人的生日是星期几,这样小明就可以拿他去忽悠不谙世事的小女生了。

输入
输入多组测试数据,每组数据一行,包括三个整数:年(1个空格)月(1个空格)日。
输入0(1个空格)0(1个空格)0表示结束。

输出
请输出星期几的英文。什么?你不会英文,果然江湖骗子都是土鳖!那就用1,2,3,4,5,6,7表示总可以了吧??!!
样例输入
2013 12 18
2010 2 1
1999 7 24
2008 1 13
0 0 0
样例输出
3
1
6
7
/这道题可以用常规的方法(需要枚举各个月份)/

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
int year,month,day;
while (scanf_s("%d %d %d", &year, &month, &day) && year && month && day != 0)/*用scanf()也可scanf_s()在从键盘读取输入时可以不用第三个参数*/
{
/*基姆拉尔森计算公式
Week=(Day + 2*Month + 3*(Month+1)/5 + Year + Year/4 - Year/100 + Year/400) % 7
(其中的Year是4位数的,如2009。“%”号是等式除7取余数)
注意:
i. 该公式中要把1月和2月分别当成:上一年的13月和14月处理。
例如:2008年1月4日要换成 2007年13月4日带入公式。
ii.该式对应的与蔡勒公式有点区别:“0”为星期1,……,“6”为星期日。*/
if (month <= 2)
{
month += 12;
year--;
}
int week_day = 0;
week_day = (year + year / 4 + year / 400 - year / 100 + 2 * month + 3 * (month + 1) / 5 + day) % 7;
/*修正week_day与日期的对应关系*/
week_day++;
printf("%d\n", week_day);
}
}

版本_2

/*
2013 12 18
2010 2 1
1999 7 24
2008 1 13
0 0 0
样例输出
3
1
6
7
*/
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int is_leap_year(int year);
int days_after_0(int year, int month, int day, int(*monthdays)[13]);
int main()
{
int ty, tm, td, tw;/*今天当天的参数;w表示周几*/
int year, month, day;/*以前某天的参数*/
int delta;
int sum_pre = 0, sum_now = 0;
int year_month[2][13] = {
{0,31,28,31,30,31,30,31,31,30,31,30,31},/*平年year_month[0]*/{0,31,29,31,30,31,30,31,31,30,31,30,31}/*闰年year_month[1]*/ };
while (1)
{//利用同起点相减法求解
printf("输入想要查询的年/月/日:\n");
scanf_s("%d %d %d", &year, &month, &day);/*用scanf()也可scanf_s()在从键盘读取输入时可以不用第三个参数*/
printf("今天的日期:年/月/日,以及星期几:\n");
//scanf("%d%d%d%d", &ty, &tm, &td, &tw);
printf("内部设定为2020 9 7 星期1\n");
ty = 2020; tm = 9; td = 7; tw = 1;
/*判断是否离开循环:*/
if (year || month || day) {}
else
break;
sum_pre = days_after_0(year,year, month, day, year_month);
sum_now = days_after_0(year,ty, tm, td, year_month);
//printf("%d %d %d->sum = %d\n", year, month, day, sum_pre);/*测试用句*/
delta = sum_now - sum_pre;
printf("%d %d %d -> sum_now=%d\n%d %d %d -> sum_pre=%d\n", ty, tm, td, sum_now, year, month, day, sum_pre);
printf("delta:%d\n", delta);
/*打印结果:*/
int result = (tw - delta % 7 + 7) % 7;
if (result == 0)
{
result = 7;
}
printf("%d\n", result);
}
}
int is_leap_year(int year)
{
if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0)
{
return 1;
}
return 0;
}
int days_after_0(int year_pre, int year,int month, int day, int(*monthdays)[13])
{
int sum = 0;
if (year > year_pre)
for (int i = year_pre/*从1优化为year*/; i < year; i++)
{
if (is_leap_year(i))/*小心参数别写作year了(很容易错)*/
{
sum += 366;
}
else
{
sum += 365;
}
}
/*加上当年的月加天:*/
for (int i = 1; i < month; i++)
{
if (is_leap_year(year))
{
sum += monthdays[1][i];
}
else
{
sum += monthdays[0][i];
}
}
sum += day;
return sum;
}
posted @   xuchaoxin1375  阅读(5)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
历史上的今天:
2022-03-08 windows上命令行@文件内容查看方案@行号显示@nlps@cat -n
点击右上角即可分享
微信分享提示