网页游戏平台代理加盟/太原seo关键词排名
C语言——蔡勒公式的使用
蔡勒公式简介:
蔡勒(Zeller)公式,是一个计算星期的公式,随便给一个日期,就能用这个公式推算出是星期几。
计算公式:
核心公式:
w=(y+[y/4]+[c/4]-2c+[26(m+1)/10]+d-1)%7
符号 | 说明 |
---|---|
w | 星期,0-星期日,1-星期一,2-星期二,3-星期三,4-星期四,5-星期五,6-星期六 |
c | 年份前两位 |
y | 年(年份后两位 |
m | 月(在蔡勒公式中,某年的1、2月要看作上一年的13、14月来计算,比如2019年1月1日要看作2018年的13月1日来计算 ) |
d | 日 |
[ ] | 代表取整,即只要整数部分。 |
注意:1.以上公式只适合于1582年10月15日之后的情形(当时的罗马教皇将恺撒大帝制订的儒略历修改成格里历,即今天使用的公历)
2.由于编程中数据都使用的是int
整数类型,所以 [ ]
可以直接去掉,整除直接使用/
就行。
1、输入一个日期,计算出是这一天是星期几?
#include <stdio.h>
int main() {int Date,year,m,d,w,y,c;printf("请输入一个日期(eg:20191130):");scanf("%d",&Date);year=Date/10000;m=Date%10000/100;d=Date%100;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;printf("%d\n",w);switch(w){case 0:printf("星期日\n");break;case 1:printf("星期一\n");break;case 2:printf("星期二\n");break;case 3:printf("星期三\n");break;case 4:printf("星期四\n");break;case 5:printf("星期五\n");break;case 6:printf("星期六\n");break; }return 0;
}
2、打印出当月的日历,例如:2019年11月日历
#include <stdio.h>
int main() {int Date,year,m,d,y,c,days,i;int week_day1,num=0;printf("请输入一个日期(eg:201911):");scanf("%d",&Date);year=Date/100;m=Date%100;y=year%100;c=year/100;switch(m){case 4:case 6:case 9:case 11:days=30;break;case 2:if(year%4==0&&year%100!=0||year%400==0){days=29;break;}else{days=28;break;}default:{days=31;break;}}if(m==1||m==2){m+=12;y-=1;}week_day1=(y+y/4+c/4-2*c+26*(m+1)/10+1-1)%7; //计算出每月的第一天是星期几
// printf("%d\n",week_day1);printf("日 一 二 三 四 五 六\n"); //或将空格换成 \tfor(i=1;i<=days;i++){++num;if(week_day1){ //将每月第一天对应星期之前空出的星期用空字符补齐printf(" "); //此处也可以使用\t进行制表,但注意前后要结构统一。--week_day1;--i;}else{printf("%2d ",i); //或将空格换成 \t}if(num%7==0)printf("\n");}printf("\n");return 0;
}
其他都正常,为什么输入201903就会爆炸呢???
错误原因
经过努力终于找到原因了:
原来三月的week_day1
的值不正常,将其值打印出后发现他的值是 -6~0
.
解决办法就是再week_day1
值计算出后加一个if
判断,如下所示:
week_day1=(y+y/4+c/4-2*c+26*(m+1)/10+1-1)%7;if(m==3)week_day1+=7;//printf("%d\n",week_day1);
结果图奉上: