PAT A1010 Radix 膜!演算法筆記題解

2021-10-05 16:50:46 字數 3135 閱讀 1010

這道題是有點坑的,題意表述上沒有明確,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...