【題解】CPE 一顆星選集:25. An Easy Problem!

題目

給你一個 N 進位的 R,找出使 R 能被 (N-1) 整除的最小 N。

7
13
2y
arping
8
5
such number is impossible!
56

UVa 連結

解法

【觀念1】N 進位的 abc = a × N^2 + b × N^1 + c。
舉例:3 進位的 123 = 1 × 3^2 + 2 × 3^1 + 3 = 18。

【觀念2】當你在 R 中看到 x 時,代表一定是 (x+1) 進位以上。
舉例:
10 進位:只會使用 0 到 9 ➡️ 當你看到 10 時,代表一定是 11 進位以上。
2 進位:只會使用 0 到 1 ➡️ 當你看到 2 時,代表一定是 3 進位以上。

注意:R 可能很大(當 N = 62 時,62 的 6 次方會超過 int),要用 long long。

#include <iostream>
#include <string>
#include <cmath>
using namespace std;

int main(){
    string s;
    string list = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
    while(cin >> s){
        int base = 2, ans = -1;
        for(int i=0; i<s.length(); i++){
            base = max(base, (int)list.find(s[i]) + 1);
        }
        for(int N=base; N<=62; N++){
            long long R = 0;
            for(int i=0; i<s.length(); i++){
                R += list.find(s[i]) * pow(N, s.length() - 1 - i);
            }
            if(R % (N - 1) == 0){
                ans = N;
                break;
            }
        }
        if(ans != -1) cout << ans << '\n';
        else cout << "such number is impossible!\n";
    }
}
👉 回到:【CPE大學程式能力檢定】目錄
發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *