一.详细分析
1-问题的开始
昨天去图书馆看到一道C语言上机题。如果2008年3月1日是星期四,那么2008年1月1日是星期几?
这里补充一下小学没有学到的“测度”知识。
- 8减1得几?
- 8到1几个数?
- 2到8几个数?
第一个问题作差就好:8-1=7
第二个问题相信大学生都没有思考过,应该是:(8-1)+1=8
第三个问题就会了,有很多解法,最基本的:(8-2)+1=7
很多人在“两个数之间有几个数”这个问题上总是算不对,或者多算1个。主要原因是小学没有进行反复训练。所以在大学上编程课这是难以逾越的鸿沟问题。
2-问题的加剧
考虑另一个问题
- 0和10个数之间有几个数。
- 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+(n−1)d
其索引是1为起点?还是以0为起点?
二项式定理呢?
这个问题在微积分中会有很大影响。
3-问题的恶化
- 2008年1月1日到2008年3月1日差几天?
- 如果2008 年3月1日是星期四,2008年1月1日是星期几?
这两个问题的难度是:
- 要把1月份的天数展开和日期想相加。
- 要把3月份的天数展开和日期想相加。
- 1月1日到底算不算1天;3月1日算不算1天。
- 计算的正确吗?
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;
}