分析:給定一對正整數,例如6和110,這個等式6 = 110是否為真?答案是「是」,如果6是十進位制數,110是二進位制數的話。現在對於任意一對正整數n1和n2,你的任務是找到乙個數字的進製,而另乙個數字的進製是給定的。
分析:修改了一下,現在是24/25。
(1)首先確定讓你判斷的數的進製,它的下限應該是自身每一位最大值再加1,比如2d34,那麼進製的下限就應該是d+1也就是14.這個數進製的上限就是另外乙個數的大小。
(2)然後二分這個區間[mi
nrad
ix,m
axra
dix]
[minradix,maxradix]
[minra
dix,
maxr
adix
],判斷這兩個數是否相等。
(3)注意:範圍可能非常的大,開unsigned long long
#include
using namespace std;
typedef
unsigned
long
long ull;
string s1,s2;
ull n1,n2,tag,radix;
ull tran
(string s,ull q)
else
if(s[i]
>=
'a'&&s[i]
<=
'z')
}return tmp;
}void
solve
(string s,ull num)
else
if(s[i]
>=
'a'&&s[i]
<=
'z')
lowradix=
max(x,lowradix);}
lowradix++
;//得到這個數的進製下限
maxradix=num;
//得到這個數的上限,就是另外的那個數
ull l=lowradix;
ull r=maxradix;
ull mid=-1
;while
(l<=r)
elseif(
tran
(s,mid)
>num)
else}if
(!flag) cout<<
"impossible"
}int
main()
else
return0;
}
得分10/25,明天補。
#include
using namespace std;
string s1,s2;
int n1,n2,tag,radix;
inttran
(string s,
int q)
else
if(s[i]
>=
'a'&&s[i]
<=
'z')
}return tmp;
}void
solve
(string s,
int num)}if
(cur>10)
if(!flag) cout<<
"impossible"
}int
main()
else
return0;
}
每天一道PAT 1010 Radix
直接暴力列舉,有乙個測試點會超時。有兩個錯誤一直沒找到,應該是有模糊的邊界條件沒考慮到。超時解決辦法 二分查詢 include include include include using namespace std vectornum1,num2 int main 數字一 char num 2 11...
1010 Radix 進製轉換(有坑)
思路 這題有坑啊 1 z表示36並不意味著只到36進製,最小2進製,最大進製 另乙個數的值 2 可能會超時,用二分 3 用long long!在二分過程中會溢位,所以要特判,當溢位時說明書過大,right mid 1 如下 include include include include includ...
PAT A1010 Radix 膜!演算法筆記題解
這道題是有點坑的,題意表述上沒有明確,radix的值並不在 0,36 之間,所以暴力遍歷是行不通的。反正也不會o o 看了下演算法筆記關於這道題的題解,根據題解中所述,假定已知的radix都是n1的 若不是則交換 則轉換為10進製後n1不會超過long long 的範圍,故僅需對n2轉換的時候進行判...