カメヲラボ

主にプログラミングとお勉強全般について書いてます

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 = px = 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を使ってテストすることを強くおすすめします。 テストデータは例で示したものだけでなく、色々なケースを想定して、自分でも用意しておきましょう。

【解説】