C语言万年历输出月份,C语言输出万年历

输入指定年月后输出对应月份的万年历。。。。。

与某小友聊天兴起搞之。。。。。

写成一个函数方便调用和修改

绝对精简绝对短233333333333333333333333333

样例2014 11

Sun Mon Tue Wed Thu Fir Sat

1

2 3 4 5 6 7 8

9 10 11 12 13 14 15

16 17 18 19 20 21 22

23 24 25 26 27 28 29

30

2010 2

Sun Mon Tue Wed Thu Fir Sat

1 2 3 4 5 6

7 8 9 10 11 12 13

14 15 16 17 18 19 20

21 22 23 24 25 26 27

28#include

#include

void calopt(int year,int mounth){

int i,j,k,weak;

int m[15]={0,31,28,31,30,31,30,31,31,30,31,30,31};

int opt[7][7];

if((year%4==0&&year%100!=0)||year%400==0){

m[2]=29;

}

weak=(year+(year-1)/4-(year-1)/100+(year-1)/400)%7;

for(i=0;i

weak+=m[i];

}

memset(opt,0,sizeof(opt));

int row=0,col=weak%7;

for(i=1;i<=m[mounth];i++){

if(col==7){col=0;row++;}

opt[row][col]=i;

col++;

}

printf("Sun\tMon\tTue\tWed\tThu\tFir\tSat\t\n");

for(i=0;i<=row;i++){

for(j=0;j<7;j++){

if(opt[i][j]==0)printf("\t");

else printf("%2d\t",opt[i][j]);

}

puts("");

}

}

int main(){

int mounth,year;

while(scanf("%d%d",&year,&mounth)!=EOF){

calopt(year,mounth);

}

return 0;

}

P.s 关于某一年第一天是星期几的判定

公元1年的第一天是星期一。这是一个计算前提。

闰年的规定:凡是年份能够被4整除、且不能被100整除的是闰年;凡是年份能被400整除的也是闰年;除此以外的年份都不是闰年。闰年366天、平年365天。

公元1年第一天之后,要计算某天是星期几,要用“这天与起始天之差”,与7求余,当余数为0,则这天与起始天星期几相同(星期一)。否则,这个余数+1就是这天的星期几。

假设year年的第一天距离起始天的差是:

(year-1)*365+(公元1年到公元year-1年内的闰年个数(每个闰年多一天))-------(1)

公元1年到公元year-1年内的闰年个数的计算:

根据闰年规定,每4年有1个闰年,这样算得到:

公元1年到公元year-1年内的闰年个数=(year-1)/4,但每一百年要扣掉1个闰年,修正一下得到:

公元1年到公元year-1年内的闰年个数=(year-1)/4-(year/100) 但是这样多扣了!

每400年又要增加一个闰年,再次修正得到:

公元1年到公元year-1年内的闰年个数=(year-1)/4-(year/100)+(year/400)

代入(1)得到年份year第一天距离起始天的差是:

(year-1)*365+(year-1)/4-(year/100)+(year/400)

这天是星期几?前面说过,是这个差与7求余+1:

[(year-1)*365+(year-1)/4-(year/100)+(year/400)]%7+1这个末尾的1可以放到被除数里面,即:

[(year-1)*365+(year-1)/4-(year/100)+(year/400)+1] %7

=[(year-1)*(364+1)+(year-1)/4-(year/100)+(year/400)+1] %7

=[(year-1)*364+(year-1)+(year-1)/4-(year/100)+(year/400)+1] %7

364是7的倍数,year364也一定是7的倍数,所以year364可以去掉,这就得到了最后的算式

=[(year-1)+(year-1)/4-(year/100)+(year/400)+1] %7

这个[]内最后的1,可以看成是新年的第1天。更一般地,year年度的第X天是星期几?可以用下式计算

[(year-1)+(year-1)/4-(year/100)+(year/400)+X] %7

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值