1010 Radix - 進位制轉換(有坑)
阿新 • • 發佈:2018-11-09
思路:
這題有坑啊
(1)z表示36並不意味著只到36進位制,最小2進位制,最大進位制=另一個數的值
(2)可能會超時,用二分
(3)用long long!在二分過程中會溢位,所以要特判,當溢位時說明書過大,right=mid-1
程式碼如下:
#include<iostream> #include<cstdio> #include<algorithm> #include<string> #include<cstring> #include<queue> #include<cmath> #include<set> #define ll long long using namespace std; const int N=1005; ll to_num(char c){ if(c>='0'&&c<='9')return c-'0'; else return c-'a'+10; } ll tra(string s,ll r){//把r進位制的x轉成10進位制 int len=s.length(); ll res=0,tmp=1; for(int i=len-1;i>=0;i--){ res+=tmp*to_num(s[i]); if(res<0||tmp<0)return -1; tmp=tmp*r; } return res; } int main(){ int tag,r; string a,b; ios::sync_with_stdio(false); cin>>a>>b>>tag>>r; if(tag==2)swap(a,b); ll numa=tra(a,r);//把r進位制的a轉換成10進位制 ll left=2,right=numa+1; for(int i=0;i<b.length();i++){ left=max(left,to_num(b[i])+1); } while(right>=left){ ll mid=(left+right)>>1; ll t=tra(b,mid); if(t==-1||t>=numa)right=mid-1; else left=mid+1; } if(tra(b,left)==numa)printf("%lld\n",left); else printf("Impossible\n"); }