【发布时间】:2018-02-26 08:06:55
【问题描述】:
好吧,我被一些看似简单的东西困住了。我正在尝试将数字转换为基数 26(即 3 = C、27 = AA 等)。我猜我的问题与模型中没有 0 有关吗?没有把握。但是如果你运行代码,你会发现数字 52、104 尤其是 676 附近的数字真的很奇怪。谁能给我一个提示我没有看到什么?我会很感激的。 (为了避免浪费你的时间,@ 是 ascii char 64,A 是 ascii char 65)
def toBase26(x):
x = int(x)
if x == 0:
return '0'
if x < 0:
negative = True
x = abs(x)
else:
negative = False
def digit_value (val):
return str(chr(int(val)+64))
digits = 1
base26 = ""
while 26**digits < x:
digits += 1
while digits != 0:
remainder = x%(26**(digits-1))
base26 += digit_value((x-remainder)/(26**(digits-1)))
x = remainder
digits -= 1
if negative:
return '-'+base26
else:
return base26
import io
with io.open('numbers.txt','w') as f:
for i in range(1000):
f.write('{} is {}\n'.format(i,toBase26(i)))
所以,我通过对我的函数(while 循环中的 2 个 if 语句)进行一些更改找到了一个临时解决方法。无论如何,我的列限制为 500,并且对函数的以下更改似乎可以达到 x = 676,所以我很满意。但是,如果你们中的任何人找到任何 x 的通用解决方案(可能是我的代码可能会有所帮助),那就太酷了!
def toBase26(x):
x = int(x)
if x == 0:
return '0'
if x < 0:
negative = True
x = abs(x)
else:
negative = False
def digit_value (val):
return str(chr(int(val)+64))
digits = 1
base26 = ""
while 26**digits < x:
digits += 1
while digits != 0:
remainder = x%(26**(digits-1))
if remainder == 0:
remainder += 26**(digits-1)
if digits == 1:
remainder -= 1
base26 += digit_value((x-remainder)/(26**(digits-1)))
x = remainder
digits -= 1
if negative:
return '-'+base26
else:
return base26
【问题讨论】:
-
通常,您需要
0的符号,并且 26 应该是基数 26 的第一个两位数。比较基数 2 和 10,其中这些数字是第一个两位数和数字值范围从0到n-1。 -
对,但这并不能真正解决我想要做的事情。我需要 excel 样式的列以及从列号到列标签的简单转换。
-
@不是你的零符号吗?
-
@Yaroslav 您要做的不是转换为base26。您正在尝试将数字映射到字母。
-
@Ev.考尼斯。是的,那么将 1000 转换为字母的最佳方法是什么?通过在 while 循环中添加 if remaining == 0: remaining += 26**(digits-1) ,我得到了更好的结果,但它仍然错过了 A 作为第一个“数字”