计算特定年月日是星期几

一.详细分析

1-问题的开始

昨天去图书馆看到一道C语言上机题。如果2008年3月1日是星期四,那么2008年1月1日是星期几?
这里补充一下小学没有学到的“测度”知识。

  1. 8减1得几?
  2. 8到1几个数?
  3. 2到8几个数?

第一个问题作差就好:8-1=7
第二个问题相信大学生都没有思考过,应该是:(8-1)+1=8
第三个问题就会了,有很多解法,最基本的:(8-2)+1=7

很多人在“两个数之间有几个数”这个问题上总是算不对,或者多算1个。主要原因是小学没有进行反复训练。所以在大学上编程课这是难以逾越的鸿沟问题。

2-问题的加剧

考虑另一个问题

  1. 0和10个数之间有几个数。
  2. 1和10之间有几个数。

这个问题的困难是两个数之间的通项公式怎么写。比如d=4的等差数列。
3 7 10 14 17
1 2 3 4 5
0 1 2 3 4
问个问题:等差数列的通项公式:

a n = a 1 + ( n − 1 ) d a_{n}=a_{1}+(n-1)d an=a1+(n1)d

其索引是1为起点?还是以0为起点?
二项式定理呢?
这个问题在微积分中会有很大影响。

3-问题的恶化

  1. 2008年1月1日到2008年3月1日差几天?
  2. 如果2008 年3月1日是星期四,2008年1月1日是星期几?

这两个问题的难度是:

  1. 要把1月份的天数展开和日期想相加。
  2. 要把3月份的天数展开和日期想相加。
  3. 1月1日到底算不算1天;3月1日算不算1天。
  4. 计算的正确吗?

4-解决之道

很多知识都有歧义,以数学学科最多。天下问题,唯记不破。如果能记得住就好。

二.概要开发

运行程序代码后可以依次输入:
1
2
2021
来计算一下2021年2月1日是星期几?

#include<stdio.h>

int main()
{
    
    
int year,mon,day;
int days;
int wk;
int weeks[12]={
    
    31,29,31,30,31,30,31,31,30,31,30,31};
days=0;
printf("day:");
scanf ("%d", &day);
days+=day;
printf("month:");
scanf ("%d", &mon);
for(int i=0;i<mon-1;i++)
{
    
    
   days=days+weeks[i];
}

printf("year:");
scanf ("%d", &year);
if (year%4==0&& year%100!=0 || year%400==0)
{
    
    
  printf("(leap year.)");
}
else
{
    
    days--;}

year-=1;
wk=(year+year/4-year/100+year/400+days) %7;
printf("%d,%d", year+1,wk);

    return 0;
}

1.数学原理

如果20210101是星期五,且一周7天。
设r=1%7=1时为星期五。
那么 a ≡ b ( m o d 7 ) a \equiv b(mod 7) ab(mod7)=1都是星期五。
以下做几点说明:

  1. 2021年01月01日是第1天。
  2. 2021年01月08日是第8天。
  3. 2021年12月31日是第365天。

2.平年

3.闰年

4.起点年

5.终点年

猜你喜欢

转载自blog.csdn.net/lihongtao8209/article/details/112131301
今日推荐