2010年をうるう年と判定するプログラムを作成せよ
うるう年の判定って、最初に4で割り切れるか調べるよね。
2008年は、普通に閏年と判定していたんでしょ。
どんなプログラムを書いたら、2010年がうるう年になるんだろう?
良かったら誰か想像で書いてみて
SCEの人に聞けよ
return year % 2 == 0;
return year == 2000 || year == 2004 || year == 2008 || year == 2012 || ... || year == 2096 || year == 2010;
return true;
このスレッドは天才チンパンジー「アイちゃん」が
言語訓練のために立てたものです。
アイと研究員とのやり取りに利用するスレッドなので、
関係者以外は書きこまないで下さい。
京都大学霊長類研究所
10を16進で計算したんじゃないの
16進数の10は16となって4で割り切れるから
>>7に着想を得て無理にコーディングしてみた
char* year = "2010";
strtol(
ダメだ俺にはこんなクソコードかけねええええ
というかプログラムの勉強すると
大抵入門書にうるう年判定コード載ってるよな
これは時刻を管理しているチップのバグではないか?
>>10 ハードウェアの問題?
数年後にまた発生しそうな問題なんでしょうかね。
任天堂信者必至だなw糞箱買ってくるwwwwwwwwwwwww
特定ハードで起きてるらしいから
>>10と同じくハードの方の問題じゃないかと。
最近のソニータイマーは凝ってんのな
100年は使われないということで、下二桁が4で割り切れるかで閏年を判断。
しかし、なにかの間違いで下一桁で計算していた?
もしそうならば、2年後に3月1日が二日続く問題が発生しそう。
is_leap = !(y % 4) ^ !(y % 100) ^ !(y % 400) を間違えて
is_leap = !(y % 4) ^ !(y % 10) ^ !(y % 400) にしちゃった
単純にyearが2100となって、400で割り切れただけだろ
オレも
>>16 が当たりのような気がする
>>17 2100 は 400 で割り切れないわけだが
19 :
17:2010/03/03(水) 11:03:27
100年先、400年先に使われているわけないんだから、4で割り切れるかだけチェックしとけばいいのに。
time_t now = time(NULL);
int days = now / 60 / 60 / 24;
/* 年を取得 */
int year = 0;
BOOL is_leap;
int day_count;
while(1) {
is_leap = !(year % 4) ^ !(year % 100) ^ !(year % 400);
int day_count = 365 + is_leap;
if( days < day_count ) break;
days -= day_count;
++year;
}
/* 月日を取得 */
/* (省略) */
void print_year(y)
{
printf("%d",1970+y);
}
int is_leap(y)
{
return(!(y % 4) ^ !(y % 100) ^ !(y % 400));
}
return (year % 4 == 0) || (year == 2010);
条件式
if(西暦年が100で割り切れる年) true;
バグ
if(西暦年が10で割り切れる年) true;
年をBCDで持ってたんだろ。
0x2010 は、 4 で割り切れる。
>>11 オフラインにしてカレンダーを2014年3月1日とかにしてみたらどうかな。
すでに2010年に1日誤差が出てるから1、2日ずらして試す必要もあるかも。
日本時間なら9時以降にするのも忘れずに。
ってオレ、何カ月も電源入れてない60GBのPS3持ってるんだった。
帰宅したら試してみるかなあ。
ファームアップデートで不具合ってのはPS3だと日常茶飯事らしいが、いくらなんでもこれは酷いな
ソフトウェア軽視のソニーらしいと言えばそれまでだが
本当は下二桁でやりたかったんだけど西暦年の下一桁で判断しちゃった
とか?
29 :
デフォルトの名無しさん:2010/03/05(金) 08:54:21
おまいら閏年の定義すら知らないのか
冷害がいろいろあるんだよ。
汎用に作成しないと、100年後は閏年かとか調べるとき困るしな。
どの例外をどう取り違えたら2010年をピンポイント誤爆するんだよw
>>31 納得はしやすいんだが、2年後には29日を飛ばすということになるけど、そうなん?
そう
今どきBCDはないだろ
>>34 クロックチップは多いよ。そのまま、LEDに繋いだら出来上がりだから。
BCDで持ってるとしても、表示はちゃんと2010年になって
なぜうるう年計算だけ0x2010になるのか俺にはさっぱりわからん
w
RTCはBCDで出力していて、表示系は当然BCDから変換して表示してるか、
あるいは直接16進を表示してる。
閏年計算で、BCD→intの変換をやるべきところを忘れて、BCDを直接intとして
扱ってしまったために、0x2010=閏年、となってしまった。
この理論だと2008年は0x2008で閏年となったことも説明できるな。
>>38 そうだとすると、2012年をうるう年として扱わないということになるな。
だれか実験できないか?
┌─┐
│●│
└─┤
_ ∩
( ゚∀゚)彡
┌─┬⊂彡
│●│ おっぱい!おっぱい!
└─┘ おっぱい!おっぱい!
できるけどケーブル抜くの面倒で触ってなかったわ
まあ近いうち試してみるね。
何と何やればいい?
オフラインにして偶数年の2/28〜3/1あたりの挙動でいいかな
>>41 そうだね。
知らぬ間にアップデートされてる可能性があるから、2012年が正常に動くようなら2010年の不具合が再現するかも。
結局よくわからんかった。
LAN抜いて電源入れたら、たしかに日付が1日ずれてたw
その後時差面倒なのでGMT0のロンドンにして各年の2/28あたりに
設定してもどうもならんかった。設定する側は閏年判定して29日
入れさせてくれないし。
オフラインでも不具合起きたってのは別の症状なのかねえ。
44 :
デフォルトの名無しさん:2010/04/18(日) 22:02:38
PS3って電池が切れると2006/1/1になるんじゃね?
つまりそこが基準点で二年後にうるう年がくる
→何故か二年ごとにうるう年が来る羽目に
45 :
デフォルトの名無しさん:2010/06/06(日) 02:01:09
なるほど!そういうことか
>>44 乾電池差し込んで無駄に2年過ごせって…なにecoは?地球は?
2008年になったら閏年かもしれないじゃん、え。
>>1 if(year%4==0 && year%100!=0) cout << year; // 2000 年が閏年じゃなくなる
どんなプログラムを作ったら2010年が閏年になるかって、なるわけないじゃん、あ。
48 :
デフォルトの名無しさん:2010/06/16(水) 18:09:29
2010.6.19
多分こうだろ。
誰か偉い人がこういうテストコード書く
assert(isLeapYear(2010));
↓
「おいテスト通らねえぞ!」
↓
「はい今直します(でも隙を見てテストどもども直さないとな・・・)」
bool isLeapYear(int year)
{
if (year == 2010) return true;
return (year % 4 == 0 && (year % 100 != 0 || year % 400 = 0));
}
↓
そのまま忘れられる。
51 :
デフォルトの名無しさん:2010/06/21(月) 14:21:45
>>29 冷害て・・・閏年に農作物が不作になるのかと思ったw
4の倍数から2を引いた数で判定すれば簡単だと思うんだがなw
53 :
デフォルトの名無しさん:2010/06/22(火) 04:56:14
うるう年の判定は一年365.2422日を無理やり365日に押し込めたときの誤差が1日分にまで
蓄積されるかどうかだから、一般的には
4で割り切れるときはうるう年、でも100年に一度は休み、400年に一度は復活ってロジックでいいよ
>>52 それだけだと2008年もうるう年だったことの説明ができない
56 :
デフォルトの名無しさん:2010/06/22(火) 19:44:42
bool checkleapyear(unsigned year)
{
// 通常のうるう年の判定
if ( (!(year % 4) && (year % 100 != 0)) || !(year % 4) ){
return true;
}
// 2010年をうるう年とする判定
else if ( year == 2010 ){
return true;
}
return false;
}
>>56 ミスったww
通常のうるう年の判定の部分、||の後は!(year % 400)だった
&& と & を打ち間違えてたバグが数年見つからなかったって事例があったよね
char y[5] = "2010";
return y[2]=='0' && y[3]=='0' ?
y[0]=='1' || y[0]=='3' || y[0]=='5' || y[0]=='7' || y[0]=='9' ?
y[1]=='2' || y[1]=='6' : y[1]=='0' || y[1]=='4' || y[1]=='8' :
y[2]=='1' | y[2]=='3' || y[2]=='5' || y[2]=='7' || y[2]=='9' ?
y[3]=='2' || y[3]=='6' : y[3]=='0' || y[3]=='4' || y[3]=='8';
2008と2010がうるう年というのは満たせたが2012が平年になってしまった
うるう年が決まるルールがもう少し複雑なら、
素直に「自作しないで関数を使いなさい」ってことになっていただろうに。
うるう年の計算方法なんてもう忘れちまえよ。
なんでいちいち自作するんだバカやろう。
さあ江戸時代に戻ろうか。
2010年の前の閏年は2006年
2010年の次の閏年は2014年
ハァ?なにこいつ
今はPS3は別のことで大騒ぎだから
この辺のことはもう忘れてるなw
>>63 現在の年を ...,+10,+6,+2,-2,-6,-10,... してたミス。
時計を合わせます、今年は西暦何年ですか? 2012
うるう年を判定する西暦を入力してください? 2010
閏年です。
時計を合わせます、今年は西暦何年ですか? 2010
うるう年を判定する西暦を入力してください? 2010
閏年ではありません。 <-- 前回の閏年から2年後なので。
:
時計の電池切れ
:
時計は既に合わせてあります。 <-- 実は2006年にリセットされている!
うるう年を判定する西暦を入力してください? 2010
閏年です。 <-- 前回の閏年から4年後なので!
>>1 電池が切れて、且つ電源をACに繋いだ時刻の2年目から4年ごとに閏年がくる。
時計を合わせます、今年は西暦何年ですか? 2006
うるう年を判定する西暦を入力してください? 2010 <-- 2006年から4年後。
閏年ではありません。
時計を合わせます、今年は西暦何年ですか? 2008
うるう年を判定する西暦を入力してください? 2010 <-- 2008年から2年後。
閏年ではありません。
:
try(時計の電池切れ。){
:
時計を合わせます、今年は西暦何年ですか? 2006
うるう年を判定する西暦を入力してください? 2010 <-- 実は2006年にリセットされてしまう!
閏年ではありません。
時計を合わせます、今年は西暦何年ですか? 2008
うるう年を判定する西暦を入力してください? 2010 <-- 実は2008年にリセットされてしまう!
閏年です。
時計を合わせます、今年は西暦何年ですか? 2010
うるう年を判定する西暦を入力してください? 2010 <-- 実は2010年にリセットされてしまう!
閏年ではありません。
時計を合わせます、今年は西暦何年ですか? 2012
うるう年を判定する西暦を入力してください? 2010 <-- 実は2012年にリセットされてしまう!
閏年です。
}
67 :
デフォルトの名無しさん:2012/02/29(水) 14:24:26.79
今日話題に上がっていないところを見ると
2012 年を閏年ではないと判定してしまう問題はおこらなかったようだな
よこ