Re: [問題] 萬年歷的一種作法..

看板C_and_CPP作者 (非天夜翔)時間14年前 (2009/10/20 03:38), 編輯推噓1(100)
留言1則, 1人參與, 最新討論串3/3 (看更多)
※ 引述《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
文章代碼(AID): #1AtC0cFe (C_and_CPP)
文章代碼(AID): #1AtC0cFe (C_and_CPP)