使用任意定义的字符在基本N数字系统上进行算术运算
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用任意定义的字符在基本N数字系统上进行算术运算相关的知识,希望对你有一定的参考价值。
首先,这不是家庭作业。我需要这个解决方案来为连接到AWS EC2实例的设备分配设备名称。我在Java工作。
我正在寻找一种解决方案,我可以定义一组任意字符作为数字来表示基数N,然后能够递增和递减这些值。例如,假设我定义了一个数字集为{f,g,h}的base-3数字系统。因此,从十进制的“0”开始递增,我们将得到序列:f, g, h, gf, gg, gh, hf, hg, hh
。
这需要使用大于base-10的数字,因此字符和罗马数字之间的简单映射不会起作用。
至于我的具体用例,我将通过分配附加到机器上的设备名称来完成它,但禁止使用某些字母,因此我将定义一组自定义允许字符。
我试着自己实现这个,并迅速找到了一个让我沮丧的兔子洞。这似乎是别人可能已经实施的东西,或者至少是其中的一部分。有任何想法吗?
答案
像这样的东西?我在幕后使用BigInteger
以避免所有溢出,并在toString
中即时生成数字。
class Counter {
// My current value.
private BigInteger n;
// The character set to use.
private char[] digits = "0123456789".toCharArray();
public Counter() {
this(0);
}
public Counter(long start) {
n = BigInteger.valueOf(start);
}
public void inc() {
n = n.add(BigInteger.ONE);
}
public void dec() {
n = n.subtract(BigInteger.ONE);
}
public void setDigits(char[] digits) {
this.digits = digits;
}
public String toString() {
StringBuilder sb = new StringBuilder();
BigInteger base = BigInteger.valueOf(digits.length);
for (BigInteger v = n; v.compareTo(BigInteger.ZERO) > 0; v = v.divide(base)) {
sb.append(digits[v.mod(base).intValue()]);
}
return sb.length() == 0 ? "" + digits[0] : sb.reverse().toString();
}
}
private void test(String s) {
Counter counter = new Counter();
counter.setDigits(s.toCharArray());
for (int i = 0; i < 100; i++, counter.inc()) {
System.out.println(counter);
}
}
private void test() {
test("0123456789");
test("fgh");
test("QwErTyUiOpAsDfGhJkLzXcVbNm");
}
以上是关于使用任意定义的字符在基本N数字系统上进行算术运算的主要内容,如果未能解决你的问题,请参考以下文章
熊猫数据框:在进行涉及两个数据框的算术运算时如何在多个索引级别上进行匹配