PAT 甲級測試題目 -- 1010 Radix
阿新 • • 發佈:2019-01-19
main 二分 href 記錄 查找字符串 += clu time ace
題目鏈接
題目描述
給你兩個數以及其中一個數的基數(進制數),找出另一個數的基數,找不到就輸出 Impassible
分析
思路不是很難,基本可以用進制轉換加循環判斷做,但是有坑。。。
坑1:上界不是36.。。。上界是確定的那個數的十進制加 1 。
坑2:暴力循環會導致時間超限,用二分法解決
坑3:二分過程中會有數據溢出,得到的負數處理方式和找到較大數處理方式一樣,因為溢出的數和題目條件不符,所以可以舍棄。
實現
#include<iostream> #include<string.h> #include<cmath> using namespace std; // 用於判斷進制數是否合理,順便記錄下未提供進制數據的進制數,用於優化查找基數次數。 // 任意進制轉換為 10 進制 long long TransSystemToDec(char* number, double radix) { double times = strlen(number) - 1; long long out = 0; for (int i = 0; i < strlen(number); i++) { if (number[i] <= '9') out += ((long long)(number[i] - '0')) * pow(radix, times); if (number[i] >= 'a') out += ((long long)(number[i] - 'a' + 10))*pow(radix, times); times--; } return out; } // 查找字符串中ASCII碼最大的字符,用於做二分查找下界 int FindMax(char* N) { int maxChar = '0'; for (int i = 0; i < strlen(N); i++) { if (maxChar < N[i]) maxChar = N[i]; } if (maxChar <= '9') maxChar = maxChar - '0'; if (maxChar >= 'a') maxChar = maxChar - 'a' + 10; return maxChar; } int main() { int maxChar = '0'; char N1[11], N2[11]; long long n1, n2, left, right, middle; int radix; int tag; cin >> N1 >> N2 >> tag >> radix; if (tag == 1) { // 將確定的數轉換成10進制整數 n1 = TransSystemToDec(N1, radix); // 獲得不確定數字符串中ASCII碼最大的字符,作為二分查找下界 maxChar = FindMax(N2); // 初始化二分查找需要的變量 left = maxChar + 1; right = n1 + 1; // 上界為確定數的十進制 +1,原因是比(確定數的十進制 + 1)再大的進制數,它對應的(確定數的十進制 +1)這個值在該進制下的表示都不會變化 middle = (left + right) / 2; while (right >= left) { if (n1 == TransSystemToDec(N2, middle)) { cout << middle; return 0; } // 這裏 || 運算符後面的判斷用於過濾比 long long 數據類型還大的數據,這樣的數據題目中是不會使其符合題意的 if (n1 < TransSystemToDec(N2, middle) || (TransSystemToDec(N2, middle) < 0)) { right = middle - 1; middle = (left + right) / 2; } else { left = middle + 1; middle = (left + right) / 2; } } cout << "Impossible"; } if (tag == 2) { n2 = TransSystemToDec(N2, radix); maxChar = FindMax(N1); left = maxChar + 1; right = n2 + 1; middle = (left + right) / 2; while (right >= left) { if (n2 == TransSystemToDec(N1, middle)) { cout << middle; return 0; } if (n2 < TransSystemToDec(N1, middle) || TransSystemToDec(N1, middle) < 0) { right = middle - 1; middle = (left + right) / 2; } else { left = middle + 1; middle = (left + right) / 2; } } cout << "Impossible"; } return 0; }
希望能幫到大家!
PAT 甲級測試題目 -- 1010 Radix