ツェラーの公式

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
アバター
みけCAT
記事: 6734
登録日時: 13年前
住所: 千葉県
連絡を取る:

ツェラーの公式

#1

投稿記事 by みけCAT » 11年前

C言語でツェラーの公式を用いて曜日を求めたのですが、なぜか1900年1月1日の曜日がうまく求まりません。

コード:

#include <stdio.h>

/* Sun Mon Tue Wed Thu Fri Sat */
#if 0
/* http://suika.fam.cx/~wakaba/wiki/sw/n/%E3%83%84%E3%82%A7%E3%83%A9%E3%83%BC%E3%81%AE%E5%85%AC%E5%BC%8F */
int getYoubi(int year,int month,int day) {
	int youbi;
	if(month<=2)month+=12;
	youbi=(year+year/4-year/100+year/400+(13*month+8)/5+day)%7;
	return youbi;
}
#else
/* http://www004.upp.so-net.ne.jp/s_honma/doweek.htm */
int getYoubi(int year,int month,int day) {
	int y1,y2;
	int youbi;
	if(month<=2)month+=12;
	y1=year/100;y2=year%100;
	youbi=(y2+y2/4+y1/4-2*y1+(13*(month+1))/5+day)%7;
	return (youbi-1+7)%7;
}
#endif

int main(void) {
	int i,j;
	int count=0;
	printf("%d\n",getYoubi(1900,1,1));
	printf("%d\n",getYoubi(2012,12,29));
	return 0;
}
このコードを実行すると、

コード:

2
6
と表示されます。
今日の曜日は正しく求まっているのに、1900年1月1日の曜日はうまく求まりません。
(月曜日のはずなのに、火曜日とされている)
どちらの関数を使っても同じ出力になりました。
どこが悪いのでしょうか?
よろしくお願いします。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

史上最悪のデスペナ
記事: 521
登録日時: 13年前

Re: ツェラーの公式

#2

投稿記事 by 史上最悪のデスペナ » 11年前

ユリウス暦の場合
(day + (month+1)*13/5 + year%100 + year%400 + 5 - year/100 ) % 7

グレゴリオ暦の場合
( day + (month+1)*13/5 + year%100 + year%400 + year/400 - 2*year/100 ) % 7
になるのではないでしょうか?(Wikiを見ました
順番は違いますが、%を使うとこを/にしているところがあるっぽい・・・・・?

box
記事: 2002
登録日時: 13年前

Re: ツェラーの公式

#3

投稿記事 by box » 11年前

こうかな?

コード:

#include <stdio.h>

int getYoubi(int y, int m, int d)
{
    if (m <= 2) {
        y--, m += 12;
    }
    return (y + y / 4 - y / 100 + y / 400 + (13 * m + 8) / 5 + d) % 7;
}

int main(void)
{
    char *w[] = {"日", "月", "火", "水", "木", "金", "土"};
    printf("%s\n", w[getYoubi(1900,  1,  1)]);
    printf("%s\n", w[getYoubi(2012, 12, 29)]);
    return 0;
}
何となく、ご提示のコードでは、1900年の1月だけでなく、
他の年の1月・2月も正しくないのかもしれません。→テストされましたか?
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

かずま

Re: ツェラーの公式

#4

投稿記事 by かずま » 11年前

みけCAT さんが書きました:C言語でツェラーの公式を用いて曜日を求めたのですが、なぜか1900年1月1日の曜日がうまく求まりません。
1月と2月は、「前年」の13月と14月です。year--; が抜けています。

おまけ

コード:

int dayofweek(int y, int m, int d) {
    y -= m < 3;
    return (y + y/4 - y/100 + y/400 + "=[^](*-/+_)%."[m] + d) % 7;
}

アバター
みけCAT
記事: 6734
登録日時: 13年前
住所: 千葉県
連絡を取る:

Re: ツェラーの公式

#5

投稿記事 by みけCAT » 11年前

かずま さんが書きました:1月と2月は、「前年」の13月と14月です。year--; が抜けています。
なるほど。うまくいったようです。

コード:

/* Sun Mon Tue Wed Thu Fri Sat */
#if 0
/* http://suika.fam.cx/~wakaba/wiki/sw/n/%E3%83%84%E3%82%A7%E3%83%A9%E3%83%BC%E3%81%AE%E5%85%AC%E5%BC%8F */
int getYoubi(int year,int month,int day) {
	int youbi;
	if(month<=2){month+=12;year--;}
	youbi=(year+year/4-year/100+year/400+(13*month+8)/5+day)%7;
	return youbi;
}
#else
/* http://www004.upp.so-net.ne.jp/s_honma/doweek.htm */
int getYoubi(int year,int month,int day) {
	int y1,y2;
	int youbi;
	if(month<=2){month+=12;year--;}
	y1=year/100;y2=year%100;
	youbi=(y2+y2/4+y1/4-2*y1+(13*(month+1))/5+day)%7;
	return (youbi-1+7)%7;
}
#endif
Project Eularでたまたま通ってしまったようなので…
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

閉鎖

“C言語何でも質問掲示板” へ戻る