【問題】我們日常使用的數制是十進位制,也就是逢十進一。當然,這種進製只是個偶然(因為我們有十個手指),它本身並沒有什麼優越的特性,也不具備計算上的便利性。計算機上使用的2進製是最小的一種進製,它的運算簡單,硬體上容易實現。
不同的進製僅僅是表達形式上的不同,都可以用來表達相同的數值。一般來說,n進製就需要有n個不同的符號。因為0…9 加上a…z 有36個符號。使用它們,我們可以構造出最多36進製的計數系統。
請編寫程式,實現int型別在任意兩個進製間的轉換(2~36進製)
只有了解了進製計數的原理(逢n進一),就很容易做轉換了。
n進製中的每一位數代表的是:它本身的真值,再乘以n的若干次方。
由此可知,n進製的數對n取模,餘數就是它的個位數。
其商再對n取模,餘數是倒數第二位數 。。。。
上**:
import
data
.list (elemindex)
tobasestr :: int
->
int-
> string
tobasestr base n
| n < base =
[t !
! n]
| otherwise = tobasestr base (n `
div` base)
++ tobasestr base (n `mod` base)
where
t =['0'..
'9']++
['a'..
'z']
tonum :: int
-> string -
>
inttonum base = foldl f 0
where
f acc x = acc * base + v x
v x = let just n = x `elemindex` t in n
t =['0'..
'9']++
['a'..
'z']
**相當容易。
軟體設計的原則之一,是要避開重複(don』t repeat yourself)
雖不明顯,tobasestr base (n
divbase) ++ tobasestr base (n
modbase)
這句也有重複的嫌疑。
本著防微杜漸的作死心理,改為:
tobasestr' :
: int -> int -> string
tobasestr' base n
| n < base =
[t !
! n]
| otherwise = concatmap (tobasestr' base)
[p,q]
where
t = ['0'..'9']++[
'a'..
'z']
(p, q)
= n `divmod` base
haskell 基礎題解(06)
題目 如果乙個數的所有真因子 不包含它自身的因子 之和恰等於其自身,則該數為完全數,也稱為完美數 perfect number 完全數有許多奇妙的性質。但它們很稀少,你來求前幾個吧。最小的乙個是 6,因為 6 1 2 3 這個完全數的定義已經很清楚了,如果沒有什麼妙法,就地毯式搜尋也可以。下法就是 ...
haskell 基礎題解(07)
題目 11 1 1 2 1 1 3 3 1 1 4 6 4 1 這個陣勢叫楊輝三角,國外叫帕斯卡三角。前一行的數字中,每兩個相鄰的數字相加就得到下一行的數字。左右兩邊的數永遠是 1 寫個程式,輸出前幾行的楊輝三角。import data.list intersperse yang hui int y...
haskell基礎題解(14)
題目 用自然數蛇形填充乙個 n 階的方陣。當n 5時,形如 這個問題用 haskell 解決時與 題目13 差別甚微。實際上,從函式式的思考習慣看,只要讓有些行作成後反轉一下就可以了。上 ju n f x x 0.n 1 where f row even row take n row n 1.odd...