haskell 基礎題解(43)

2021-09-26 09:19:07 字數 1519 閱讀 5146

【問題】我們日常使用的數制是十進位制,也就是逢十進一。當然,這種進製只是個偶然(因為我們有十個手指),它本身並沒有什麼優越的特性,也不具備計算上的便利性。計算機上使用的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 (ndivbase) ++ tobasestr base (nmodbase)這句也有重複的嫌疑。

本著防微杜漸的作死心理,改為:

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...