/
実行時間制限: 1 sec / メモリ制限: 256 MiB
問題文
A+B Problem
問題文
2つの整数 A, B の和を求めるプログラムを書け.
A, B, A+B のいずれも 32 ビット符号付き整数に収まる.
入力
A_1 B_1 A_2 B_2 … 0 0入力は 100 個以下のケースからなる.各ケースは 1 行に A と B が空白区切りで書かれている.
A = B = 0 となる行で入力は終了であり,このケースは処理してはならない.
出力
各テストケースに対し,A+B の値を 1 行に出力せよ.
という A 問題が完成し,テスティングへ向かう JAPLJ. 疲れからか,不幸にも A+B Problem にバグを出してしまう.JAPLJ をかばいすべての責任を負ったきゅうりに対し, コンテストの主,大学院生丸橋に言い渡された示談の条件とは….
丸橋「誤答ソースコードを正しく直すんだよおう早くしろよ.」
あなたは,JAPLJ をかばいすべての責任を負ったきゅうりをかばいすべての責任を負った気持ちになって,JAPLJ の 3 つの誤答プログラムを撃墜できるテストケースをそれぞれ 1 つ出力しなければならない,
課題
A+B Problem (問題文参照)に対する以下の 3 つの C++ で記述された誤答プログラムに対し,それぞれを撃墜するテストケースを求めよ.
より正確に言えば,各誤答プログラムそれぞれに対し,A+B Problem の問題文・入力セクションの制約を満たすようなテストケースであって,誤答プログラムにそのケースを入力として与えた際に誤った回答を出力するようなものを出力するプログラムを書け.
回答 1 のソースコード:
#include <iostream>
using namespace std;
int main()
{
int A, B;
while(cin >> A >> B, A+B!=0) {
cout << A+B << endl;
}
return 0;
}
回答 2 のソースコード:
#include <iostream>
using namespace std;
int myAbs(int n)
{
if(n < 0) return -n;
else return n;
}
int main()
{
int A, B;
while(cin >> A >> B, (A|B) != 0) {
while(myAbs(A) >= 100000) {
if(A > 0) {
B += 100000;
A -= 100000;
} else {
B -= 100000;
A += 100000;
}
}
if(A > 0) {
for(int i=0; i<A; ++i) {
B++;
}
} else {
for(int i=0; i<-A; ++i) {
B--;
}
}
cout << B << endl;
}
return 0;
}
回答 3 のソースコード:
#include<iostream>
using namespace std;
int C[3][32];
int main()
{
int A, B;
while(cin >> A >> B, A!=0 || B!=0) {
for(int i=0; i<32; ++i) {
C[0][i] = (A >> i) & 1;
C[1][i] = (B >> i) & 1;
}
for(int i=0; i<32; ++i) {
if(C[0][i] + C[1][i] >= 2) {
C[C[1][i-1] & 1][i+1]++;
C[0][i]--;
C[1][i]--;
}
C[2][i] = C[0][i] + C[1][i];
}
int R = 0;
for(int i=0; i<32; ++i) {
R |= C[2][i] << i;
}
cout << R << endl;
}
return 0;
}
入力
t
一行に整数 t のみが書かれており,これは t 番目の回答を撃墜するようなテストケースを求めることを表す.
出力
t 番目の回答を撃墜するようなテストケースを出力せよ.
出力のフォーマットは A+B Problem の入力フォーマットに従ったものでなければならない.
制限
すべての入力データは以下の制限を満たす.
- 1 \leq t \leq 3
採点基準
入力は全部で 3 つのテストケースからなり,
- t = 1 のケースに正解すれば 33 点
- t = 2 のケースに正解すれば 33 点
- t = 3 のケースに正解すれば 34 点
を与える.
入出力例
この問題には入出力例はない.
statement: kyuridenamida