ZeroJudge F360: Shady的複製品

總共有 N 個 slim shady,但只有一個是 real slim shady,剩下都在 imitating,請問有多少人在 imitating 呢?

範例測資

範例輸入範例輸出
輸入不超過 100 行,每行有一個整數 N (2 ≤ N ≤ 10^1000),EOF結束。輸出有多少在 imitating。
2
10
100000
1
9
99999

解題思路

使用字串的方式來收資料,並且宣告一個函式用來減1、一個字串 ans 預設為 “”。

在函式中,需要兩個參數,分別為目前的位置 position 和是否需要減一的布林值 minus。如果 position == -1 就 return 函式。如果目前位置要 -1,則判斷目前位置的字元是否為 0,如果是 0 就要呼叫函式並且將 position-1 然後 minus 要是 true,還要將 9 += 到 ans 中,否則就將字元換成數字之後 -1 += 到 ans 中。如果 minus 為 false,則將目前位置的字元 += 到 ans 中並且呼叫函式 position-1 跟 false。

在主程式的時候要呼叫函式並且要用字串的長度-1 跟 true。

輸出時倒著輸出 ans,並且要在迴圈外面宣告一個布林值 first,因為要去掉前面的 0,如果目前字元是 0 且 first == true,則直接 continue,否則就將 first 設為 false 且輸出目前字元。

範例程式碼-ZeroJudge F360: Shady的複製品

#include <iostream>
using namespace std;

string ans = "", str;

void minusOne(const bool minus, const int position) {
    if (position == -1) return;
    if (minus) {
        if (str[position] == '0') {
            ans += '9';
            minusOne(true, position-1);
        }
        else {
            const int num = int(str[position] - '0');
            ans += to_string(num-1);
            minusOne(false, position-1);
        }
    }
    else {
        ans += str[position];
        minusOne(false, position-1);
    }
}

int main() {
    cin.sync_with_stdio(0);
    cin.tie(0);
    while (cin >> str) {
        ans = "";
        minusOne(true, str.length()-1);
        bool first = true;
        for (int i = ans.length()-1; i>=0; i--) {
            if (ans[i] == '0') {
                if (first) continue;
            }
            first = false;
            cout << ans[i];
        }
        cout << "\n";
    }
}

//ZeroJudge F360
//Dr. SeanXD

發佈留言