ABC281 (A, B) 感想

お久しぶりです。ちょっと忙しくて投稿ができていませんでした。 年末ということもあって、街の空気も師走の忙しさやクリスマスに対する晴れやかな気持ち、お正月に向かう穏やかな気持ちなどが入り混じったような感じですが、自分はやっぱり卒論とプロジェクトの方が忙しくてそれどころではないという感じです。 そんな中今日からは、再び毎日投稿をとりあえず12/31までを目標に再開しようと思います。そして投稿内容は競プロにします。自分が書いたコードや感想、学んだことをざっくばらんに書き連ねていく予定です。どうぞお付き合いください。

ABC 281

A問題

これは流石にA問題なので流石に簡単でした。言及はしません。

#include <iostream>

using namespace std;

int main() {
    int N;
    cin >> N;
    for (int i = N; i >= 0; i--)
        cout << i << endl;
    return 0;
}

B問題

文字列を扱う問題ですが、文字列の長さが決まっているので、もっと愚直に「2文字目から7文字目までを取り出して、文字列から数値に変換する」のような実装の方が良かったような気がします。全て文字列で扱っているため100000~999999を判別するのに、最上位桁に留意する必要があるため関数を二つも用意する羽目になってしまっています。最初がまた、string型を使いましたが、char*で扱った方がiteratorなども出てこず簡単だったように感じます。 ただここで一つ学びだったのが、string型のiteratorに要素参照の*をつけると、char型が返ってくることがわかりました。勝手にstring型のサイズ1の要素が返ってくると思っていたので、これは良い学びになりました。以下がコードです。

#include <iostream>
#include <string>

using namespace std;

bool isUppercase( char s) {
    if (s >= 'A' && s <= 'Z') return true;
    return false;
}

bool isNum( char s) {
    if (s >='0' && s <= '9') return true;
    return false;
}

bool isNumEx0( char s) {
    if (s >='1' && s <= '9') return true;
    return false;
}
int main() {
    string S;
    cin >> S;
    if (S.size() != 8) {
        cout << "No" << endl;
        return 0;
    }
    bool flag = true;
    for(auto st = S.begin(); st != S.end(); ++st) {
        if (st == S.begin() || st == S.end()-1) {
            if (!isUppercase(*st)) {
                flag = false;
                break;
            }
        } else {
            if (st == S.begin()+1) {
                if (!isNumEx0(*st)) {
                    flag = false;
                    break;
                }
            } else {
                if (!isNum(*st)) {
                    flag = false;
                    break;
                }
            }
        }
    }
    if (flag) cout << "Yes" << endl;
    else cout << "No" << endl;
    return 0;
}