题目:用户输入年份,打印该年日历(蔡勒公式计算该年1.1是周几,只适用于1582年10月15日之后!) 后面附有蔡勒公式详解(百度百科)了解即可。
代码如下:
//输入年份,打印该年日历(蔡勒公式计算该年1.1是周几,只适用于1582年10月15日之后!)
#include<stdio.h>
int Get_Week(int year,int month,int day){ //导入蔡勒公式计算某年1.1是周几
if(month==1||month==2){
year--;
month+=12;
}
int c=year/100;
int y=year-c*100;
int week=y+y/4+c/4-2*c+26*(month+1)/10+day-1;
while(week<0){
week+=7;
}
week%=7;
int arr[7]={0,1,2,3,4,5,6};
return arr[week];
}
bool IsLeapYear(int year){ //计算是否为闰年,bool类型返回true/false
if(year%400==0||(year%4==0&&year%100!=0)){
return true;
}
return false;
}
int Get_YM_Day(int year,int month){ //一维数组 查表法 返回该年该月有多少天
int arr[13]={29,31,28,31,30,31,30,31,31,30,31,30,31};
int i=0;
if(IsLeapYear(year)&&month==2){
return arr[i];
}
else{
i=month;
return arr[i];
}
}
void Get_Date(int day,int week){ //打印日历(与低阶版已知该月有多少天,该月第一天为周几打印该月日历相同)
char strfill[]={" "}; //字符串填充
int i=0,k=0;
printf(" 日 一 二 三 四 五 六 \n");
for(i=0;i<week;i++){
printf("%s",strfill);
k++; //控制一行输入七个后换行
}
for(i=1;i<=day;i++){
printf("%3d",i);
k++;
if(k%7==0){
printf("\n");
}
}
printf("\n \n");
}
int main(){
int year=0,month=1;
printf("请输入年份:\n");
scanf("%d",&year);
if(year<=1582) return 0; //蔡勒公式只适用于1582年10月15日之后
int week=Get_Week(year,1,1); //蔡勒公式计算某年1.1是周几
for(month=1;month<=12;month++){
int day=Get_YM_Day(year,month);
printf("%d year %d month Date\n",year,month);
Get_Date(day,week);
week=(week+day)%7; //用于计算一月往后每个月为周几!
}
return 0;
}
代码实现如下:(太长了 分成了三块😅)
蔡勒公式(百度百科):
ps:大家对蔡勒公式了解即可,不必做过多研究。
希望大家静下心好好分析代码然后自己动手敲,切勿直接复制粘贴!
加油加油!!!😊