我正在尝试编写Haskell函数,以将整数转换为带有字母数字的字符串。
用字母数字表示法,是指与此转换匹配的数字表示法:
1 -> A 2 -> B 3 -> C .. 25 -> Y 26 -> Z 27 -> AA 28 -> AB 29 -> AC ..
我发现此函数可以将十进制数字转换为罗马数字,并尝试对其进行修改以执行我想要的操作。但是我没有得到正确的结果。问题在于,在字母数字法中,“ A”作为单位或倍数时可能具有不同的“权重”(值可能为1或0)。
您知道如何获得正确的转换吗?
使用模块化算法非常简单。我们将编写一个以相反顺序返回字母的函数。我们可以在之后将其修复。基本思想是重复除以26。因此:
rawCellName :: Int -> String rawCellName x | x <= 0 = [] rawCellName x = toEnum (fromEnum 'A' + r) : rawCellName q where (q, r) = (x-1) `quotRem` 26
然后在最高级别,我们只需解决API异常问题:
cellName :: Int -> String cellName = reverse . rawCellName
在ghci中尝试一下:
> map cellName [1..5] ["A","B","C","D","E"] > map cellName [25..30] ["Y","Z","AA","AB","AC","AD"]