CodeIQ過去問集03:ちゃんとコーディング
本稿はCodeIQで2013年5月23日~2013年6月17日に出題された「ちゃんとコーディング」という問題を再編集したものです。 ※出題時と記述が一部異なる場合がありますがご了承ください。
ちゃんとコーディング
【問題】
方程式を解くバグの無いプログラムをCまたはC++で書いてください。 たとえば、
5x + 2 = 3x + 6
という方程式を解くと、
5x - 3x = 6 - 2 2x = 4 x = 2
のようになります。
ax + b = cx + d
という形で、a, b, c, dの部分を入力として与えますので、方程式の解を出力してください。
【注意】
(1)解けない場合
x + 1 = x + 1
は、xがどんな値でも成り立ってしまいます。また、
x + 1 = x + 2
は、xがどんな値でも成り立ちません。 このような場合は、impossibleと出力してください。
(2)割り切れない場合
4x + 1 = x + 2 4x - x = 2 - 1 3x = 1 x = 1/3
のように、割り切れない場合は分数の形で表示してください。
(3)符号の扱い
解が正の値または0の場合は、符号をつけないでください。 負の値になる場合は、「-」を付けてください。 ただし、分数の場合は値の先頭に付けてください。 1/-3ではなく-1/3のようにしてください。
(4)入力
入力は標準入力からです。 1行目には問題数を、2行目からn行分は問題のデータです。
ax + b = cx + d
の、a, b, c, dを半角スペースで区切ったものです。
nは1から1000までの整数、a, b, c, dは符号付き32bit整数(-2147483648~2147483647)で収まる範囲とします。
(5)出力
方程式が解ける場合は、 x = p や x = p/q の形で出力してください。 符号のつけ方は(3)の記述通りです。 約分後の分母・分子の値も符号付き32bit整数の範囲で収まるものとします。 また、分数の形で答える場合に、 x = 2/1 のように分母が1になったり、 x = 4/6 のように、 既約分数(それ以上約分できない分数)でないものは不可とします。 また、=の前後は半角スペースを1つずつ入れ、1問ごとに改行してください。 (1)で説明したとおり、解けない場合は impossible と出力してください。
【入出力例】
====入力====
5 5 2 3 6 4 1 1 2 1 1 1 1 9 4 2 3 1 1 1 2
====出力====
x = 2 x = 1/3 impossible x = -1/7 impossible
【テスト】
プログラムのコンパイル・実行は、http://ideone.com/で行います。 言語はC++ 4.7.2 (gcc-4.7.2)を選択し、プログラム実行の制限時間は5秒、メモリの上限は256MBとします。 テストデータは挑戦終了まで非公表としますので、サンプルで正しい出力が得られたからと言って 最高評価が得られるとは限りません。
【アドバイス】
普段gcc以外のコンパイラを使っている場合は、gccを使ってテストすることを強くおすすめします。 テストデータは例で示したものだけでなく、色々なケースを想定して、自分でも用意しておきましょう。