PaizaオンラインハッカソンVol.6に参加してみた(緑川つばめミッション, C++)

注意: この記事は1年以上前に掲載されたものです。情報が古い場合がありますのでお気を付け下さい。

PaizaオンラインハッカソンVol.6に参加してみた(六村リオミッション, C++)に続いて、緑川つばめミッションも行ってみた。こちらの方はかなりすっきりしたコードが書けるので、六村リオミッションが面倒な方はやってみよう。

解答例

[code lang=”cpp”]#include <iostream>
using namespace std;
int main(void){
string str;
getline(cin, str);

auto num = stoi(str);

auto num10 = str.at(0) – ‘0’;
auto num1 = str.at(1) – ‘0’;

auto result = num + num10 + num1;

cout << result << endl;

return 0;
}[/code]

解説

これは入力された文字列を元に、それを数値にしたものに、それぞれ10の位と1の位を足した合計を出力するものである。

入力された文字列を数値にする場合は、基本的にはstoiを使えば問題ない。

ただし、std::stringのat()については、ただ単純に分けた場合だと数値ではなく、それに割り当てられた文字コードとなってしまい、正しくない結果が出力されてしまう。そのため、文字ではなく数値にするには必ず’0’という文字コード分の数値だけ減算しなければならない。

結果

cf: https://paiza.jp/poh/joshibato/tsubame/result/a3b926bf

当然ながら、全テストケース通過で、所要時間はいずれも0.01秒だった。

最後に

これは文字と数値の扱いに気をつけなければならないところが若干あることを除けば、簡単にクリアできるだろう。さて、最後は一番難しい霧島京子ミッションに進んでみたい。

見直し後のコード(9月3日追記)

上記のコードを根本的に見直したものを以下に記述する。

[code lang=”cpp”]#include <iostream>
using namespace std;

int main(){
// 数字を取得する(文字列として)
string str;
getline(cin, str);
auto num = stoi(str);

// 10〜99以外の場合は例外を投げる
const auto min = 10;
const auto max = 99;
if (num < min || max < num) {
throw "The number must be " + to_string(min) + " – " + to_string(max) +".";
}

// それぞれの桁数を計算する
// (文字として扱われるため、必ず’0’の文字コードの数値を減算する)
const auto zero = ‘0’;
for (auto ch : str) {
num += ch – zero;
}

// 数値を出力する
cout << num << endl;

return 0;
}[/code]

この改良版の場合、最低値と最大値を任意に指定できることと、許可された値1 以外がニュ力された時に例外を投げられるようにしていること、数値であればint型で収まる範囲であれば桁数を任意に設定することができるようになっている。

ついでに例外時のメッセージも最小値と最大値を任意に表示できるようになっている。

今回のミッションでは2桁ということが保証されているため、見直し前のコードでも良いのだが、メンテナンス性を考えるのであれば見直し後のコードのように任意に指定できるようにするのが望ましいだろう。

ウェブマスター。本ブログでITを中心にいろいろな情報や意見などを提供しています。ご用の方はコメントかコンタクトフォームにて。

  1. ここでは10〜99 []