作者csihcs (非天夜翔)
看板C_and_CPP
标题Re: [问题] 万年历的一种作法..
时间Tue Oct 20 03:38:12 2009
※ 引述《gene07 (不要迷恋哥,哥只是个传说)》之铭言:
: 通常..写万年历不是都用阵列吗??
: 这是我写的上半部宣告
: #include<stdio.h>
: #include<math.h>
: int main()
: {int year;
: printf( "输入年份:" );
: fflush(stdout);
: scanf("%d", &year);
: int month[]={31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
: int num, first_day;
: first_day = (1+(year-1)+(year-1)/4-(year-1)/100+(year-1)/400)%7;
: if ( (year%4==0 && year%100!=0) || year%400==0 )
: month[1] = 29;
: 想说...如果不用阵列改用if来计算...
: 这样不是要用12个if来跑吗??
: 如果又碰到闰年..这样不是就有13个if...
: 那如果用if宣告..该怎麽表示阿..我不懂= =..
//
http://tamweb.tam.gov.tw/faq/calendar-0409277-2.htm
// 逢 4的倍数 闰 , 例如:西元1992、1996年,为 4的倍数, 闰 年。
// 逢 100的倍数不闰, 例如:西元1800、1900年,为 100的倍数,不闰年。
// 逢 400的倍数 闰 , 例如:西元2000、2400年,为 400的倍数, 闰 年。
// 逢4000的倍数不闰, 例如:西元4000、8000年,为4000的倍数,不闰年。
http://zh.wikipedia.org/zh-hant/%E6%98%9F%E6%9C%9F%E7%9A%84%E8%A8%88%E7%AE%97
同上的缩址
http://tinyurl.com/yhx9fdy 星期的计算
http://zh.wikipedia.org/zh-hant/%E8%94%A1%E5%8B%92%E5%85%AC%E5%BC%8F
同上的缩址
http://tinyurl.com/yh4ru8y 蔡勒公式
int check[] = {4000,400,100,4};
int addDay[] = { 0, 1, 0,1};
int monthDay[] = {0,31,28,31,30,31,30,31,31,30,31,30,31};
// 1, 2, 3, 4, 5, 6, 7, 8, 9,10,11,12
int cc;
int yy;
int mm;// 1 ~ 12
int ww;
int day;
// 事先取得年、月,只取 yy >= 0, 1 <= mm <= 12
cc = yy / 100 + 1;
day = monthDay[mm];
for(int i = 0 ; i < 4 ; i++) {
if(yy % check[i] == 0) {
day += addDay[i];
break;
}
}
int tY = yy % 100,tM = 26*(mm + (mm < 3 ? 12 : 0) + 1)/10;
if(yy >= 1583 || (yy == 1582 && mm > 10))
ww = (tY + tY/4 + cc/4 - 2*cc + tM ) % 7; // 当月 1 号的星期
else
ww = (tY + tY/4 + cc/4 - 2*cc + tM + 4) % 7;
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 211.74.9.2
1F:推 bala045:蔡勒公式 = = 10/20 05:03