這道題是有點坑的,題意表述上沒有明確,radix的值並不在(0,36)之間,所以暴力遍歷是行不通的。
反正也不會o(╥﹏╥)o
看了下演算法筆記關於這道題的題解,根據題解中所述,假定已知的radix都是n1的(若不是則交換),則轉換為10進製後n1不會超過long long 的範圍,故僅需對n2轉換的時候進行判斷其是否溢位。
下面是演算法筆記的源**:
using
namespace std;
#include
long
long map[
256]
,inf=
(1ll
<<63)
-1;char n1[20]
,n2[20]
,tmp[20]
;int tag,radix;
void
init()
long
long
convertnum10
(char a,
int radix,
long
long t)
return ans;
}long
long
findlargestdigit
(char a)
return ans+1;
//point3
}int
cmp(
char a,
long
long radix,
long
long t)
long
long
binarysearch
(char a,
long
long left,
long
long right,
long
long t)
return-1
;}intmain()
long
long t,low,high,ans;
t=convertnum10
(n1,radix,inf)
; low=
findlargestdigit
(n2)
; high=
max(t,low)+1
;//point5
ans=
binarysearch
(n2,low,high,t);if
(ans ==-1
) cout<<
"impossible\n"
;else cout<
return0;
}
point1:init()函式中for迴圈,直接對char進行迴圈,寫的真的很好(反正我是想不到這樣寫╮(╯▽╰)╭),而且這也是我第一次見到這麼寫for迴圈的(暴露了自己做題很少的事實了);
point2 && point4:if(ans<0 || ans>t) return -1; 中ans>t這句實際上是不需要的,因為一方面 t = inf 時ans就是long long型別,ans<0 就是ans>inf 了,另一方面t != inf 而是n1的十進位制值時,因為後面point4處有判斷所以這裡其實不需要,加上的話,point4處的那條語句就永遠不會執行了,num>t的情況已經變成了num<0了;
point3:這裡一定要注意,我們遍歷n2字元陣列找到最大的數後,一定要+1才是當前進製的下界呀;
point5:這裡我開始沒能理解,為什麼n2的radix的上界是【n2的下界和n1的10進製值】取最大後+1,後來又在csdn上看到一篇有關這題的blog,發現他也寫到了此處,若n1的10進製值》n2的下界,則n2的進製是不會比n1的10進製值+1還大的,不然n2即使為「10」也不符合。
雖然這道題歸類是二分,但其實這道題二分的函式是很好寫的,就是個模板,難得就是怎麼想到這種思路,確定上下界以及字元和數字間的處理。
下面是我根據point2 && point4 稍微修改後的**:
using
namespace std;
#include
long
long map[
256]
;char n1[20]
,n2[20]
,tmp[20]
;int tag,radix;
void
init()
long
long
convertnum10
(char a,
int radix)
return ans;
}long
long
findlargestdigit
(char a)
return ans+1;
}int
cmp(
char a,
long
long radix,
long
long t)
long
long
binarysearch
(char a,
long
long left,
long
long right,
long
long t)
return-1
;}intmain()
long
long t,low,high,ans;
t=convertnum10
(n1,radix)
; low=
findlargestdigit
(n2)
; high=
max(t,low)+1
; ans=
binarysearch
(n2,low,high,t);if
(ans ==-1
) cout<<
"impossible\n"
;else cout<
return0;
}
PAT1010 Radix(進製轉換)
分析 給定一對正整數,例如6和110,這個等式6 110是否為真?答案是 是 如果6是十進位制數,110是二進位制數的話。現在對於任意一對正整數n1和n2,你的任務是找到乙個數字的進製,而另乙個數字的進製是給定的。分析 修改了一下,現在是24 25。1 首先確定讓你判斷的數的進製,它的下限應該是自身...
(自用隨筆)PAT A1010
計算乙個數是否能通過某個進製轉換為另乙個數的問題。思路就是把輸入的資料轉化為全數字,再計算number大小。在計算第二個不知道進製的數時,從最低位開始計算,一旦數字超過了number1,就讓進製加一,重新計算,知道數字大小相等。網上比較高效的方法是二分法找進製,我用的笨方法,從2開始往上找。坑點就是...
1010 Radix 進製轉換(有坑)
思路 這題有坑啊 1 z表示36並不意味著只到36進製,最小2進製,最大進製 另乙個數的值 2 可能會超時,用二分 3 用long long!在二分過程中會溢位,所以要特判,當溢位時說明書過大,right mid 1 如下 include include include include includ...