みけCATのにっき(仮)
つれづれなるまゝに、日くらし、PCにむかひて、心に移りゆくよしなし事を、そこはかとなく書きつくれば、あやしうこそものぐるほしけれ。
(本当か!?)
出典

AOJふざけるな

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

AOJふざけるな

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

AOJ 1000 A + B Problem
簡単だと思って、普通にプログラムを書くと、なぜかWrong Answer。

CODE:

#include 

int main(void) {
	long long a,b;
	while(scanf("%lld%lld",&a,&b)==2) {
		printf("%lld\n",a+b);
	}
	return 0;
}
しかし、long longをintにする=オーバーフローの危険がある 状態で投稿すると、Acceptedになりました。

CODE:

#include 

int main(void) {
	int a,b;
	while(scanf("%d%d",&a,&b)==2) {
		printf("%d\n",a+b);
	}
	return 0;
}
なぜオーバーフローする方が正解になるのか、なぜ仕様に忠実に実装すると落ちるのか。
わけがわからないよ。

オーバーフローしていることを確認するために、次のプログラムを投げてみました。

CODE:

#include 
#include 

int main(void) {
	long long  a,b;
	while(scanf("%lld%lld",&a,&b)==2) {
		if(a+b>(long long)INT_MAX || a+b<(long long)INT_MIN)return 1;
		printf("%lld\n",a+b);
	}
	return 0;
}
結果はRuntime Error。予想通りオーバーフローが検出されました。
問題文に書いてあるとおりの仕様を実装すると間違っていると言われるなんて、わけがわかりません。
みんなはこの意地悪な引っ掛け問題についてどう思いますか?
コメント大募集です。
オフトピック
「integers」には32ビットという意味は無いよな?な?な?な?な?

とりあえずlong longでもオーバーフローする可能性があるというツッコミはなしで。
追記
AOJのWeb Boardに書き込んだところ、int型でオーバーフローしないデータに修正していただけたようです。
最後に編集したユーザー みけCAT on 2012年4月03日(火) 16:45 [ 編集 2 回目 ]
理由: 直ったようなので報告

コメントはまだありません。