Re: [問題] 萬年歷的一種作法..
※ 引述《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
推
10/20 05:03, , 1F
10/20 05:03, 1F
討論串 (同標題文章)