一、给出年月日,计算该日是星期几
在年份中,分为闰年和平年(闰年比一般年份多1天),到第x-1年共经过多少个闰年,[m]表示对m取整,如[2.85]=2;
到第x-1年如果不考虑百年份,那么经过了[x-1/4]个闰年,
但是这个数值包含了既是整百年份又不能被400整除的年份,因此用[x-1/4]-[x-1/100],
但是这个值又少了被400整除的年份,我们加上是整百年份又能被的年份,[x-1/4]-[x-1/100]+[x-1/400],这个值就是到第x-1年年末共有多少个闰年。
有一个闰年就比一个一般年份多一天,有多少个闰年就比多少个一般年份多 多少天,有[x-1/4]-[x-1/100]+[x-1/400]个闰年,就比[x-1/4]-[x-1/100]+[x-1/400]个一般年份这么多天。
那么到第x年的第a天,一共经过了(x-1)*365+[x-1/4]-[x-1/100]+[x-1/400]天年
到第x年的第x月的第a天,一共经过了(x-1)*365+[x-1/4]-[x-1/100]+[x-1/400]+a天
因为(x-1)*365÷7与(x-1)÷7同余,所以用x-1+[x-1/4]-[x-1/100]+[x-1/400]+a 除以7所得余数即为星期几
根据历法原理,有下面公式,代入即可求得某年某月某日是星期几
此处x是公元的年数,C是从这年的元旦算到这天为止(包括这一天在内)的日数,表示为的整数部分,即三个分数式只取整数部分,余数略去。求出S,再用7除,如果恰能除尽,这一天必为星期日;若余数是1,这一天是星期一。余数是2,则为星期二;依此类推。程序中,在计算c之前,还要判断该年份是否是闰年,这样决定2月是28天还是29天。
//给定年月日,计算该日是星期几
#include<stdio.h>
main(){
int a,b,c,d,s,z;
printf(" 请输入年月日 yyyy,mm,dd:\n");
scanf(" %d,%d,%d",&a,&b,&c);
if((a%4==0&&a%100!=0) ||(a%400==0))//判断是否为闰年
{
if(b==1) d=c;
if(b==2) d=c+31;
if(b==3) d=c+60;
if(b==4) d=c+91;
if(b==5) d=c+121;
if(b==6) d=c+152;
if(b==7) d=c+182;
if(b==8) d=c+213;
if(b==9) d=c+244;
if(b==10) d=c+274;
if(b==1) d=c+305;
if(b==12) d=c+335;
}
else {
if(b==1)d=c;
if(b==2) d=c+31;
if(b==3) d=c+59;
if(b==4) d=c+90;
if(b==5) d=c+120;
if(b==6) d=c+151;
if(b==7) d=c+181;
if(b==8) d=c+212;
if(b==9) d=c+243;
if(b==10) d=c+273;
if(b==1) d=c+304;
if(b==12) d=c+334;
}
s=a-1+(a-1)/4-(a-1)/100+(a+1)/400+d;
z=s%7;//除7判断是星期几
if(z==0) printf(" 这一天为星期天。\n");
if(z==2) printf(" 这一天为星期二。\n");
if(z==3) printf(" 这一天为星期三。\n");
if(z==4) printf(" 这一天为星期四。\n");
if(z==5) printf(" 这一天为星期五。\n");
if(z==6) printf(" 这一天为星期六。\n");
}
二、编制万年历
#include<stdio.h>
long int f(int year,int month)
{
if(month<3) return year-1;
else
return year;
}
long int g(int month)
{
if(month<3) return month+13;
else
return month+1;
}
long int n(int year,int month,int day)
{
return 1461L*f(year,month)/4+153L*g(month)/5+day;
}
int w(int year,int month,int day)
{
return (int)((n(year,month,day)%7-621049L%7+7)%7);
}
int date[12][6][7];
int day_tb1[][12]={
{31,28,31,30,31,30,31,31,30,31,30,31},
{31,29,31,30,31,30,31,31,30,31,30,31}
};
void main(){
int sw,leap,i,j,k,wd,day;
int year;
char title[]="SUM MON TUE WED THU RI SAT";
printf("请输入年份(yyyy:)");
scanf("%d",&year);
sw=w(year,1,1);
leap=year%4==0&&year%100||year%400==0;
for(i=1;i<12;i++)
for(j=0;j<6;j++)
for(k=0;k<7;k++)
date[i][j][k]=0;
for(i=0;i<12;i++)
for(wd=0,day=1;day<=day_tb1[leap][i];day++){
date[i][wd][sw]=day;
sw=++sw%7;
if(sw==0) wd++;
}
printf("\n|============================ %d年日历========================================|\n|",year);
for(i=0;i<6;i++)
{
for(wd=0,k=0;k<7;k++)
wd+=date[i][5][k]+date[i+6][5][k];
wd=wd?6:5;
printf("%2d %s %2d %s |\n|",i+1,title,i+7,title);
for(j=0;j<wd;j++)
{
printf(" ");
for(k=0;k<7;k++)
if(date[i][j][k])
printf(" %4d",date[i][j][k]);
else printf(" ");
printf(" ");
for(k=0;k<7;k++)
if(date[i+6][j][k])
printf(" %4d",date[i+6][j][k]);
else printf(" ");
printf(" |\n|");
}
}
puts("======================================================================================|");
}
上面这个空格位置老搞不好。
#include<stdio.h>
//万年历
//定义星期
#define Mon 1
#define Tues 2
#define Wed 3
#define Thur 4
#define Fri 5
#define Sat 6
#define Sun 0
//定义月份
#define January_days 31
#define February_days 28
#define March_days 31
#define April_days 30
#define May_days 31
#define June_days 30
#define July_days 31
#define August_days 31
#define September_days 30
#define October_days 31
#define November_days 30
#define December_days 31
//定义每月天数
#define first1month January_days
#define first2month January_days+February_days
#define first3month January_days+February_days+March_days
#define first4month January_days+February_days+March_days+April_days
#define first5month January_days+February_days+March_days+April_days+May_days
#define first6month January_days+February_days+March_days+April_days+May_days+June_days
#define first7month January_days+February_days+March_days+April_days+May_days+June_days \
+July_days
#define first8month January_days+February_days+March_days+April_days+May_days+June_days \
+July_days+August_days
#define first9month January_days+February_days+March_days+April_days+May_days+June_days \
+July_days+August_days+September_days
#define first10month January_days+February_days+March_days+April_days+May_days+June_days \
+July_days+August_days+September_days+October_days
#define first11month January_days+February_days+March_days+April_days+May_days+June_days \
+July_days+August_days+September_days+October_days+November_days
int known_weekday = Tues;
int known_year = 1901;//从1901年开始
int konwn_month = 1;
int known_day = 1;
int day_count(int month)
{
switch(month)
{
case 1: return 0;break;
case 2: return first1month;break;
case 3: return first2month;break;
case 4: return first3month;break;
case 5: return first4month;break;
case 6: return first5month;break;
case 7: return first6month;break;
case 8: return first7month;break;
case 9: return first8month;break;
case 10: return first9month;break;
case 11: return first10month;break;
case 12: return first11month;break;
}
}
/*char * month_name(int month)
{
switch(month)
{
case 1:
return "January";
break;
case 2:
return "February";
break;
case 3:
return "March";
break;
case 4:
return "April";
break;
case 5:
return "May";
break;
case 6:
return "June";
break;
case 7:
return "July";
break;
case 8:
return "August";
break;
case 9:
return "September";
break;
case 10:
return "October";
break;
case 11:
return "November";
break;
case 12:
return "December";
break;
default:
break;
}
}*/
char * month_name(int month)
{
switch(month)
{
case 1:
return "一月";
break;
case 2:
return "二月";
break;
case 3:
return "三月";
break;
case 4:
return "四月";
break;
case 5:
return "五月";
break;
case 6:
return "六月";
break;
case 7:
return "七月";
break;
case 8:
return "八月";
break;
case 9:
return "九月";
break;
case 10:
return "十月";
break;
case 11:
return "十一月";
break;
case 12:
return "十二月";
break;
default:
break;
}
}
/*按格式打印某年某月名称*/
void first_line_print(int month, int year)
{
//printf("%20s %d \n",month_name(month),year);
printf("%8d年 %s \n",year, month_name(month));
}
/*按格式打印星期名称*/
void week_print()
{
//printf("%-6s%-6s%-6s%-6s%-6s%-6s%-6s\n","Sun.", "Mon.", "Tues.", "Wed.", "Thur.", "Fri.", "Sat.");
printf("%-3s%-3s%-3s%-3s%-3s%-3s%-3s\n","日", "一", "二", "三", "四", "五", "六");
}
/*计算该年该月份与已知日子之间的距离天数*/
int date_distance_count(int month, int year)
{
int leap_year_count = 0;
int i;
int distance;
if (year > known_year)
{
for (i=known_year; i<year; i++)
{
if(((i%4 == 0) && (i%100 != 0) ) || (i%400 == 0))
{
leap_year_count++;
}
}
if (month > 2)
{
if(((year%4 == 0) && (year%100 != 0) ) || (year%400 == 0))
{
leap_year_count++;
}
}
}
else
if (year == known_year)
{
if (month > 2)
{
leap_year_count = 1;
}
}
distance = (year - known_year)*365 + leap_year_count + day_count(month);
return distance;
}
/*确定该月份第一天是星期几*/
int makesure_firstday_weekday(int month, int year)
{
int date_distance = 0;
int weekday;
date_distance = date_distance_count(month, year);
weekday = (known_weekday + date_distance)%7;
return weekday;
}
/*依次打印出该月份的日子*/
void print_in_turn(int month, int firstday, int year)
{
int i = 1;
int weekday;
switch(firstday)
{
case Sun:
break;
case Mon:
printf("%-3s","");
break;
case Tues:
printf("%-6s","");
break;
case Wed:
printf("%-9s","");
break;
case Thur:
printf("%-12s","");
break;
case Fri:
printf("%-15s","");
break;
case Sat:
printf("%-18s","");
break;
}
switch(month)
{
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
{
for(i=0; i<31; i++)
{
weekday = (firstday + i)%7;
printf("%-3d",i+1);
if(weekday == Sat)
{
printf("\n");
}
}
break;
}
case 2:
{
if(((year%4 == 0) && (year%100 != 0) ) || (year%400 == 0)) /*闰年*/
{
for(i=0; i<29; i++)
{
weekday = (firstday + i)%7;
printf("%-3d",i+1);
if(weekday == Sat)
{
printf("\n");
}
}
break;
}
else /*平年*/
{
for(i=0; i<28; i++)
{
weekday = (firstday + i)%7;
printf("%-3d",i+1);
if(weekday == Sat)
{
printf("\n");
}
}
break;
}
}
case 4:
case 6:
case 9:
case 11:
{
for(i=0; i<30; i++)
{
weekday = (firstday + i)%7;/*计算该天是星期几*/
printf("%-3d",i+1);
if(weekday == Sat)
{
printf("\n");/*如果是星期六,则换行*/
}
}
break;
}
}
}
//
void date_print(int month, int year)
{
int firstday;
firstday = makesure_firstday_weekday(month, year);
print_in_turn(month, firstday, year);
printf("\n");
}
void main_month(int month, int year)
{
first_line_print(month, year);
week_print();
date_print(month, year);
printf("\n\n");
}
void main_calendar(int year)
{
int i;
for(i=1; i<=12; i++)
{
main_month(i, year);
}
}
int main()
{
int year;
printf("请输入年份:year = ");
scanf("%d",&year);
printf("\n");
while(year < 1902)
{
printf("请输入大于1901的年份\n");
printf("请输入年份:year = ");
scanf("%d",&year);
printf("\n");
}
main_calendar(year);
scanf(" ");
return 0;
}