總共有 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