【CPE一顆星選集】UVA10093 – An Rasy Problem!【C++】

C++

問題文

Online Judge
Online Judge

与えられた文字列から数値を抽出し、その数値が特定の基数で割り切れるかどうかをチェックしています。
基数は2から62の間で変化し、割り切れる基数が見つかるまで基数を増やしています。

62進数は0-9とA-Z,a-zの合計です

サンプルコード

cpe/一顆星/uva10093/01.cpp at main · mintson0517/cpe
Contribute to mintson0517/cpe development by creating an account on GitHub.

コードの解説

string str;

while(getline(cin, str){
処理内容
}

まずは文字列を入力されるまでtrueとしてwhileループをさせます

while (!isalnum(str[index])){
            index++;
        }

このコードでは入力されている文字列たちがアルファベットまたは数字になる時は文字列の何番目にあるかを判断します。

つまりisalnum()関数に!をつけることにより、アルファベットまたは数字ではないときはWhileループがずっと続きます。

for (int i = index; i < str.length(); i++){
            if (isdigit(str[i])){
                tmp = str[i] - '0';
            } else if (isupper(str[i])){
                tmp = str[i] - 'A' + 10;
            } else if (islower(str[i])){
                tmp = str[i] - 'a' + 36;
            }
            
            sum += tmp;
            if (base < tmp){
                base = tmp;
            }
        }

文字列内の各文字を処理し、その文字が数字であるか、大文字のアルファベットであるか、小文字のアルファベットであるかを判別し、それに応じて数値に変換します。

そして、各文字の数値を sumに加算し、同時に最大の数値(基数を求めるための基準となる数値)を baseに更新します

for (;base < 62; base++){
            if (sum % base == 0){
                cout << base + 1 << endl;
                break;
            }
        }
        if (base == 62){
            cout << "such number is impossible!" << endl;
        }
    }

もし for ループが62まで進んでも割り切れる基数が見つからない場合、”such number is impossible!” というメッセージを出力します。

タイトルとURLをコピーしました