2ちゃんねる ★スマホ版★ ■掲示板に戻る■ 全部 1- 最新50  

■ このスレッドは過去ログ倉庫に格納されています

2010年をうるう年と判定するプログラムを作成せよ

1 :デフォルトの名無しさん:2010/03/02(火) 22:33:27
うるう年の判定って、最初に4で割り切れるか調べるよね。

2008年は、普通に閏年と判定していたんでしょ。
どんなプログラムを書いたら、2010年がうるう年になるんだろう?

良かったら誰か想像で書いてみて


2 :デフォルトの名無しさん:2010/03/02(火) 22:36:12
SCEの人に聞けよ

3 :デフォルトの名無しさん:2010/03/02(火) 22:39:11
return year % 2 == 0;

4 :デフォルトの名無しさん:2010/03/02(火) 22:41:48
return year == 2000 || year == 2004 || year == 2008 || year == 2012 || ... || year == 2096 || year == 2010;


5 :デフォルトの名無しさん:2010/03/02(火) 22:46:54
return true;

6 :デフォルトの名無しさん:2010/03/02(火) 22:49:26
このスレッドは天才チンパンジー「アイちゃん」が
言語訓練のために立てたものです。

アイと研究員とのやり取りに利用するスレッドなので、
関係者以外は書きこまないで下さい。

                  京都大学霊長類研究所

7 :デフォルトの名無しさん:2010/03/02(火) 22:53:22
10を16進で計算したんじゃないの

16進数の10は16となって4で割り切れるから


8 :デフォルトの名無しさん:2010/03/02(火) 23:05:59
>>7に着想を得て無理にコーディングしてみた

char* year = "2010";
strtol(

ダメだ俺にはこんなクソコードかけねええええ

9 :デフォルトの名無しさん:2010/03/02(火) 23:12:52
というかプログラムの勉強すると
大抵入門書にうるう年判定コード載ってるよな

10 :デフォルトの名無しさん:2010/03/02(火) 23:37:20
これは時刻を管理しているチップのバグではないか?

11 :デフォルトの名無しさん:2010/03/02(火) 23:50:35
>>10
ハードウェアの問題? 

数年後にまた発生しそうな問題なんでしょうかね。

12 :デフォルトの名無しさん:2010/03/03(水) 00:17:25
任天堂信者必至だなw糞箱買ってくるwwwwwwwwwwwww

13 :デフォルトの名無しさん:2010/03/03(水) 00:56:21
特定ハードで起きてるらしいから>>10と同じくハードの方の問題じゃないかと。

14 :デフォルトの名無しさん:2010/03/03(水) 03:19:05
最近のソニータイマーは凝ってんのな

15 :デフォルトの名無しさん:2010/03/03(水) 03:31:17
100年は使われないということで、下二桁が4で割り切れるかで閏年を判断。
しかし、なにかの間違いで下一桁で計算していた?
もしそうならば、2年後に3月1日が二日続く問題が発生しそう。

16 :デフォルトの名無しさん:2010/03/03(水) 07:44:52
is_leap = !(y % 4) ^ !(y % 100) ^ !(y % 400) を間違えて
is_leap = !(y % 4) ^ !(y % 10) ^ !(y % 400) にしちゃった

17 :デフォルトの名無しさん:2010/03/03(水) 10:41:15
単純にyearが2100となって、400で割り切れただけだろ

18 :デフォルトの名無しさん:2010/03/03(水) 10:50:28
オレも >>16 が当たりのような気がする

>>17
2100 は 400 で割り切れないわけだが

19 :17:2010/03/03(水) 11:03:27
>>18
すまんw適当にもほどがすぎたw

20 :デフォルトの名無しさん:2010/03/03(水) 11:56:58
100年先、400年先に使われているわけないんだから、4で割り切れるかだけチェックしとけばいいのに。


21 :デフォルトの名無しさん:2010/03/03(水) 12:17:02
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;
}

/* 月日を取得 */
/* (省略) */

22 :デフォルトの名無しさん:2010/03/03(水) 12:20:36
void print_year(y)
{
  printf("%d",1970+y);
}
int is_leap(y)
{
  return(!(y % 4) ^ !(y % 100) ^ !(y % 400));
}

23 :デフォルトの名無しさん:2010/03/03(水) 12:43:29
return (year % 4 == 0) || (year == 2010);

24 :デフォルトの名無しさん:2010/03/04(木) 05:27:45
条件式
if(西暦年が100で割り切れる年) true;

バグ
if(西暦年が10で割り切れる年) true;

25 :デフォルトの名無しさん:2010/03/04(木) 08:17:25
年をBCDで持ってたんだろ。
0x2010 は、 4 で割り切れる。


26 :デフォルトの名無しさん:2010/03/04(木) 10:00:58
>>11
オフラインにしてカレンダーを2014年3月1日とかにしてみたらどうかな。
すでに2010年に1日誤差が出てるから1、2日ずらして試す必要もあるかも。
日本時間なら9時以降にするのも忘れずに。

ってオレ、何カ月も電源入れてない60GBのPS3持ってるんだった。
帰宅したら試してみるかなあ。

27 :デフォルトの名無しさん:2010/03/04(木) 21:22:31
ファームアップデートで不具合ってのはPS3だと日常茶飯事らしいが、いくらなんでもこれは酷いな
ソフトウェア軽視のソニーらしいと言えばそれまでだが

28 :デフォルトの名無しさん:2010/03/05(金) 01:28:53
本当は下二桁でやりたかったんだけど西暦年の下一桁で判断しちゃった
とか?

29 :デフォルトの名無しさん:2010/03/05(金) 08:54:21
おまいら閏年の定義すら知らないのか
冷害がいろいろあるんだよ。
汎用に作成しないと、100年後は閏年かとか調べるとき困るしな。


30 :デフォルトの名無しさん:2010/03/05(金) 23:33:44
どの例外をどう取り違えたら2010年をピンポイント誤爆するんだよw

31 :デフォルトの名無しさん:2010/03/06(土) 00:14:03
>>25
今までで一番納得した。

32 :デフォルトの名無しさん:2010/03/06(土) 00:23:08
>>31
納得はしやすいんだが、2年後には29日を飛ばすということになるけど、そうなん?

33 :デフォルトの名無しさん:2010/03/06(土) 12:13:12
そう

34 :デフォルトの名無しさん:2010/03/06(土) 12:35:52
今どきBCDはないだろ

35 :デフォルトの名無しさん:2010/03/06(土) 12:56:22
>>34
クロックチップは多いよ。そのまま、LEDに繋いだら出来上がりだから。

36 :デフォルトの名無しさん:2010/03/06(土) 20:17:29
BCDで持ってるとしても、表示はちゃんと2010年になって
なぜうるう年計算だけ0x2010になるのか俺にはさっぱりわからん

37 :デフォルトの名無しさん:2010/03/06(土) 21:55:28
w

38 :デフォルトの名無しさん:2010/03/07(日) 13:04:56
RTCはBCDで出力していて、表示系は当然BCDから変換して表示してるか、
あるいは直接16進を表示してる。
閏年計算で、BCD→intの変換をやるべきところを忘れて、BCDを直接intとして
扱ってしまったために、0x2010=閏年、となってしまった。
この理論だと2008年は0x2008で閏年となったことも説明できるな。

39 :デフォルトの名無しさん:2010/03/07(日) 13:15:58
>>38
そうだとすると、2012年をうるう年として扱わないということになるな。
だれか実験できないか?

40 :デフォルトの名無しさん:2010/03/07(日) 21:18:51
   ┌─┐
   │●│
   └─┤
   _   ∩
  ( ゚∀゚)彡
┌─┬⊂彡
│●│ おっぱい!おっぱい!
└─┘      おっぱい!おっぱい!

41 :デフォルトの名無しさん:2010/03/08(月) 11:51:27
できるけどケーブル抜くの面倒で触ってなかったわ
まあ近いうち試してみるね。
何と何やればいい?
オフラインにして偶数年の2/28〜3/1あたりの挙動でいいかな

42 :デフォルトの名無しさん:2010/03/08(月) 12:10:11
>>41
そうだね。
知らぬ間にアップデートされてる可能性があるから、2012年が正常に動くようなら2010年の不具合が再現するかも。

43 :デフォルトの名無しさん:2010/03/15(月) 17:21:54
結局よくわからんかった。
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
なるほど!そういうことか

46 :デフォルトの名無しさん:2010/06/06(日) 08:38:00
>>44
だれか2014年で実験してみてくれ。

47 :デフォルトの名無しさん:2010/06/06(日) 08:40:06
>>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

49 :デフォルトの名無しさん:2010/06/18(金) 01:59:34
多分こうだろ。

誰か偉い人がこういうテストコード書く
assert(isLeapYear(2010));
 ↓
「おいテスト通らねえぞ!」
 ↓
「はい今直します(でも隙を見てテストどもども直さないとな・・・)」
bool isLeapYear(int year)
{
  if (year == 2010) return true;
  return (year % 4 == 0 && (year % 100 != 0 || year % 400 = 0));
}
 ↓
そのまま忘れられる。

50 :デフォルトの名無しさん:2010/06/18(金) 06:59:09
>>49
ありえる。

51 :デフォルトの名無しさん:2010/06/21(月) 14:21:45
>>29
冷害て・・・閏年に農作物が不作になるのかと思ったw

52 :以下、名無しにかわりましてVIPがお送りします:2010/06/21(月) 21:24:51
4の倍数から2を引いた数で判定すれば簡単だと思うんだがなw

53 :デフォルトの名無しさん:2010/06/22(火) 04:56:14
うるう年の判定は一年365.2422日を無理やり365日に押し込めたときの誤差が1日分にまで
蓄積されるかどうかだから、一般的には
4で割り切れるときはうるう年、でも100年に一度は休み、400年に一度は復活ってロジックでいいよ

54 :デフォルトの名無しさん:2010/06/22(火) 07:34:43
>>53
スレ違い

55 :デフォルトの名無しさん:2010/06/22(火) 10:22:52
>>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;
}


57 :デフォルトの名無しさん:2010/06/22(火) 19:50:24
>>56
ミスったww
通常のうるう年の判定の部分、||の後は!(year % 400)だった

58 :デフォルトの名無しさん:2010/06/23(水) 00:04:07
&& と & を打ち間違えてたバグが数年見つからなかったって事例があったよね

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が平年になってしまった

59 :デフォルトの名無しさん:2010/06/23(水) 00:05:38
うるう年が決まるルールがもう少し複雑なら、
素直に「自作しないで関数を使いなさい」ってことになっていただろうに。

うるう年の計算方法なんてもう忘れちまえよ。
なんでいちいち自作するんだバカやろう。

60 :デフォルトの名無しさん:2010/06/23(水) 19:55:06
さあ江戸時代に戻ろうか。

61 :デフォルトの名無しさん:2010/06/23(水) 20:51:38
2010年の前の閏年は2006年
2010年の次の閏年は2014年

13 KB
■ このスレッドは過去ログ倉庫に格納されています

★スマホ版★ 掲示板に戻る 全部 前100 次100 最新50

read.cgi ver 05.02.02 2014/06/23 Mango Mangüé ★
FOX ★ DSO(Dynamic Shared Object)