C++の練習を兼ねて, AtCoder Beginner Contest 079 の 問題C(Train Ticket)を解いてみた.
■感想.
① 解答を後で見たところ, if – else if で押し切っているので, なるほどと感心させられた.
② +++, ++-, … , --- の8通り調べる方針は, 一致していたので, 着眼点が大きくブレてはいなかったと思われる.
③ char型 -> int型 の変換方法について, 勉強になったと思われる.
本家のサイトABC 079 解説をご覧下さい。
■C++版プログラム
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 |
#include <iostream> #include <string> using namespace std; #define FOR(i, a, b) for(int i=(a); i<(b); ++i) #define joisinoOperators(b) (b ? "+" : "-") // 与えられた二整数 x, y について, 加算 or 減算 を計算して返却. // @param x: 第一引数. // @param y: 第二引数. // @param o: 演算指定用(0 … 加算, 1 … 減算). // @return: 与えられた二整数を計算し, 返却. int joisinoCalculate(int x, int y, int o) { return (o ? x + y : x - y); } int main() { // 1. 入力情報取得. string N; cin >> N; // 2. 7 に等しくなる op1, op2, op3 のパターンを計算. // op1, op2, op3 を 000, 001, ... , 111 と見て, 0 … プラス, 1 … マイナス で考える方針とした. int op = 0; FOR(i, 0, 8) { op = i; int comp7 = 0; comp7 = joisinoCalculate(N[0] - '0', N[1] - '0', op & 1); comp7 = joisinoCalculate(comp7, N[2] - '0', op & 2); comp7 = joisinoCalculate(comp7, N[3] - '0', op & 4); if(comp7 == 7) break; } // 3. 表示用文字列作成. string joisinoString = ""; joisinoString += N[0]; joisinoString += joisinoOperators(op & 1); joisinoString += N[1]; joisinoString += joisinoOperators(op & 2); joisinoString += N[2]; joisinoString += joisinoOperators(op & 4); joisinoString += N[3]; joisinoString += "=7"; // 4. 出力 ~ 後処理. cout << joisinoString << endl; return 0; } |
■参照サイト
AtCoder Beginner Contest 079
char型をint型に変換する方法と注意【数値化 キャスト 文字列変換】