выполнение арифметики в базовой системе счисления N с использованием произвольно определенных символов - PullRequest
0 голосов
/ 10 сентября 2018

Во-первых, это не домашнее задание.Мне нужно это решение для назначения имен устройств для устройств, подключенных к экземплярам AWS EC2.Я работаю в Java.

Я ищу решение, в котором я могу определить произвольный набор символов, которые будут служить в качестве чисел для представления чисел из базы N, а затем иметь возможность увеличивать и уменьшать эти значения,Например, скажем, я определяю систему счисления base-3 с набором цифр {f, g, h}.Таким образом, начиная с «0» в десятичном виде и увеличивая его, мы получим последовательность: f, g, h, gf, gg, gh, hf, hg, hh.

Это должно работать с числами, превышающими основание-10, поэтому простое сопоставление между символами и римскими цифрами не сработает.

Что касается моего конкретного случая использования, я будуделать это с назначением имен устройств, подключенных к машине, но некоторые буквы запрещено использовать, поэтому я буду определять пользовательский набор разрешенных символов.

Я попытался реализовать это сам и быстро пошел внизкроличья нора логики, которая сбила меня с толку.Похоже, что-то еще кто-то уже реализовал, или, по крайней мере, частично.Есть идеи?

1 Ответ

0 голосов
/ 10 сентября 2018

Как то так?Я использую 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");
}
...