我正在尝试使用JExcel重新排序一些Excel列。我还需要找到对其他单元格的引用,然后重新映射它们以引用正确的单元格。我觉得我已经完成了很多艰苦的工作,但我遇到了绊脚石。
我在wikipedia上找到了这个代码,与SO:
相关联 public static String toBase26(int number){
number = Math.abs(number);
String converted = "";
// Repeatedly divide the number by 26 and convert the
// remainder into the appropriate letter.
do
{
int remainder = number % 26;
converted = (char)(remainder + 'A') + converted;
number = (number - remainder) / 26;
} while (number > 0);
return converted;
}
但是当我将数字35输入其中时,就会发生这种情况:
number
= 35 remainder
= 9 converted
= char(9 +'A')+“”= J number
=(35-9)/ 26 = 1 remainder
= 1 char(1+'A')
= B converted
= char(1 +'A')+“J”= BJ 以预期的方式,如基数10(35)=基数26(19)。但我实际上想要参考专栏AJ。
我无法解开为获得正确的信件而需要做出的改变。每当我尝试在纸上进行处理时,我最终都会破坏之前提取的字母。例如,我认为this不会起作用,因为这意味着我第一次以remainder
为8,然后将其转换为I,除非我错过了某些内容?
对此的任何帮助将不胜感激。我环顾四周,浪费了足够的时间。我只是想要一些帮助才能让它发挥作用。
答案 0 :(得分:5)
这个'hexavidecimal系统'背后的绊脚石是它有一个0,但是单位列跳过0并且范围仅来自A-Z。请考虑以下十进制转换:
A 1 (0*26 + 1)
...
Z 26 (0*26 + 26)
AA 27 (1*26 + 1)
...
AZ 52 (1*26 + 26)
BA 53 (2*26 + 1)
...
BZ 78 (2*26 + 26)
CA 79 (3*26 + 1)
...
ZZ 702 (26*26 + 26)
AAA 703 (1*26*26 + 1*26 + 1)
看到问题?十六进制数字中缺少“零”:
00A 1
...
00Z 26
0AA 27
...
0AZ 52
0BA 53
...
0BZ 78
0CA 79
...
0ZZ 702 (26*26 + 26)
AAA 703 (1*26*26 + 1*26 + 1)
但是,单位列不会有零!
显然我们不打印这些零,但它应该有助于你理解出了什么问题。
这是我们的算法。我在假设十进制0 =十六进制A,1 - >的情况下编写算法。 B,25 - > Z,26 - > AA等等,因为它让我更容易缠头。如果这不是假设你想在运行代码之前减去1:)
0. If number =< 0, return.
1. Modulo by 26. Convert 0-25 to 'A'-'Z'. //This is our units column.
Loop {
2. Divide the number by 26 (integer division rounding down).
3. If number =< 0, return.
4. Modulo by 26. Convert 0-25 to 'Z','A'-'Y'. //This is our next column (prepend to string output).
}
转换小数730 - &gt; ABC hexavigesimal
730的模数乘以26 = 2 - >单位列的'C'
将730除以26 = 28
模28乘26 = 2 - >数十列的'B'
将28除以26 = 1
模1乘26 = 1 - &gt;数百列的'A'
将1除以26 = 0
Number为空,因此返回'ABC'
答案 1 :(得分:3)
这是一个简单的Python函数,用于计算数字的六进制表示(在任意基数中),其中a
等于1
(不是0
)。
问题的棘手部分在于,在每个步骤中,您需要在余下的1
和10
之间进行操作,因此您需要在模数中考虑到这一点。以下代码通过每次从数字中减去1
来解释它。然后0
成为非常方便的结束条件,因为您无法在hexavigesimal中表示0
(wikipedia entry表示它λ
)。
# Formats a number as a bijective base N string.
def bijective(n, base):
chars = ''
while n != 0:
chars = chr((n - 1) % base + 97) + chars
n = (n - 1) / base
return chars
# Examples!
if __name__ == '__main__':
base = 26
for n in range(1, 2 * base * base):
print('{}: {}'.format(n, bijective(n, base)))
在pythonanywhere上查看此操作。
我在this gist中添加了一个javascript版本。