1. 程式人生 > >【PAT】甲級1010

【PAT】甲級1010

這裡寫圖片描述

這題思路並不是很難,但是有幾個坑點!
①首先要用longlong型別應該不難看出來。
②試答案的時候不能順序搜尋,要用二分搜尋。
③二分的邊界要想對,最小的應該是數中最小的那個數+1,比如:123a,那麼這個數最小的進位制數為11(因為數中有a)。最大的邊界應該為基準數的十進位制值(例如:基準數的十進位制為為1000000,另一個數為10,那麼它可以是1000000進位制的,也滿足條件)。
④如果算的進位制數太大時,可能會爆longlong,那麼在計算中還要注意對溢位的判斷(num<0)。

程式碼如下:

#include<queue>
#include<cmath>
#include<stack> #include<cstdio> #include<vector> #include<cstring> #include<iostream> #include<algorithm> using namespace std; typedef long long LL; #define INF 0x3f3f3f3f #define CLR(a,b) memset(a,b,sizeof(a)) #define PI acos(-1.0) LL toNum(char c) //轉化為阿拉伯數字
{ if (c >= '0' && c <= '9') return c-'0'; return c-'a'+10; } LL toDecimal(string str,LL radix) //轉到十進位制 { LL num = 0; LL ant = 1; for (int i = str.size()-1 ; i >= 0 ; i-- , ant *= radix) { num += ant * toNum(str[i]); if (num < 0 || ant < 0
) //需要判斷這個,也許進位制太大了呢 return -1; } return num; } int main() { string a,b; int tag,radix; LL l,r,mid; cin >> a >> b >> tag >> radix; if (tag == 2) swap(a,b); LL base = toDecimal(a,radix); l = 2; r = base; for (int i = 0 ; i < b.size() ; i++) //算出最低的進位制數 { l = max(l , toNum(b[i])+1); } while (r >= l) //二分查詢第一個大於base的進位制數 { mid = (l+r) >> 1; LL t = toDecimal(b,mid); if (t >= base || t == -1) //-1時太大溢位了 r = mid-1; else l = mid+1; } if (toDecimal(b,l) == base) //驗證一下是否相等 cout << l << endl; else puts("Impossible"); return 0; }