是否可以将任何碱基转化为任何碱基(范围2至46)

时间:2012-09-25 06:28:23

标签: algorithm math

我知道将任何基地转换为任何基地都很简单。首先,将任何base转换为decimal,然后将decimal转换为任何其他base。但是,我之前已经完成了2到36的范围,但从未完成2到46次。

我不明白我将在36之后放什么,因为36表示'z'(1-10是十进制数字,然后是字母表的26个字符)。

请解释36之后会发生什么。

5 个答案:

答案 0 :(得分:5)

用于数字的符号是任意的。例如,base64编码使用'A'表示零值数字,'0'表示值为52的数字。在base64中,数字通过字母AZ,然后是小写字母az,然后是传统数字0-9 ,然后通常是'+'和'/'。

一个基础60系统使用了这些符号:babalonian numerals

所以使用的符号是任意的。除了你说你的系统所发生的事情之外,没有任何事情在36之后“发生”。

答案 1 :(得分:5)

每个基地都有目的。通常我们进行基本转换以使复杂计算更简单。

以下是一些最受欢迎的基地及其代表。

  • 2二进制数字系统

    几乎所有计算机都在内部使用,是基础二。两个数字分别为01,分别显示为OFF和ON。

  • 八进制系统

    偶尔用于计算。八位数字为0–7

  • 10十进制

    世界上最常用的数字系统,用于算术。它的十位数是0–9

  • 12-duodecimal(dozenal)系统

    经常被使用,因为可分为2,3,4和6.它通常被用作数十和十字表示的数量的一部分。

  • 16十六进制系统

    经常用于计算。十六位数字为0–9,后跟A–F

  • 60-sexagesimal系统

    起源于古代的苏美尔,并传给了巴比伦人。它仍然是我们现代圆形坐标系(度,分和秒)和时间测量(分钟和小时)的基础。

  • 64-Base 64

    偶尔也会用于计算,使用数字A–Z, a–z, 0–9以及另外两个字符,通常是+/

  • <强> 256字节

    由计算机内部使用,实际上将八个二进制数字组合在一起。对于人类阅读,字节通常以十六进制显示。

八进制,十六进制和base-64系统经常用于计算,因为它们易于作为二进制的简写。例如,每个十六进制数字都具有等效的4位二进制数。

Radices通常是自然数。然而,其他定位系统也是可能的,例如,黄金比率基数(其基数是非整数代数数)和负基数(基数为负数)。


您的疑问是,在基数超过36之后,我们是否可以将任何基地转换为任何其他基地 (字母数+ +数字数= 26 + 10 = 36)

以64-Base为例          它使用A-Z(大写)(26),a-z(小写)(26),0-9(10),再加上2个字符。这样就解决了36的约束。

由于我们有64个基数的(26 + 26 + 10 + 2)个64个符号用于表示,我们可以表示64个碱基中的任何数字。同样,对于更多的基础,他们使用不同的符号进行表示。

来源http://en.wikipedia.org/wiki/Radix

答案 2 :(得分:2)

使用数字系统,你可以扮演上帝。

扮演上帝

您需要了解的是,符号完全是任意的。对于“36后会发生什么”,没有上帝给予的规则。您可以随意定义自己喜欢的内容。

要对具有特定基数的数字进行编码,您只需要以下内容:

  • base-many distinct symbols
  • 符号的总订单

一个任意的例子

当然,为某个基础创建这样的符号表有无限的可能性:

Θ
ェ
す
)
0
・
_
o
や
ι

你可以使用它来编码基数为10的数字。Θ是零元素,是一个,等等。

约定

当然,如果你开始使用上面的符号表,你的同行也不会太高兴。因为符号是任意的,我们需要约定。 0, 1, 2, 3, 4, 5, 6, 7, 8, 9是一个约定,我们用于十六进制,二进制等的符号也是如此。人们普遍同意我们使用什么符号表作为基础,这就是为什么我们可以读取别人写下的数字。< / p>

答案 3 :(得分:1)

要记住的重要一点是,所有数字都是价值的象征。因此,如果您想这样做,您只需创建一个包含每个位置值的列表。在36之后,你只需要用完你可以制作逻辑顺序的字符。例如,如果您使用带有70个奇数字符的柬埔寨字母,则可以使用80。

答案 4 :(得分:0)

这是我写的完整代码,希望这会有所帮助。

import java.util.Scanner;

    /* 
    * author : roottraveller, nov 4th 2017
    */

public class BaseXtoBaseYConversion {

    BaseXtoBaseYConversion() {
    }

    public static String convertBaseXtoBaseY(String inputNumber, final int inputBase, final int outputBase) {
        int decimal = baseXToDecimal(inputNumber, inputBase);
        return decimalToBaseY(decimal, outputBase);
    }

    private static int baseXNumeric(char input) {
        if (input >= '0' && input <= '9') {
            return Integer.parseInt(input + "");
        } else if (input >= 'a' && input <= 'z') {
            return (input - 'a') + 10;
        } else if (input >= 'A' && input <= 'Z') {
            return (input - 'A') + 10;
        } else {
            return Integer.MIN_VALUE;
        }
    }

    public static int baseXToDecimal(String input, final int base) {
        if(input.length() <= 0) {
            return Integer.MIN_VALUE;
        }

        int decimalValue = 0;
        int placeValue = 0;

        for (int index = input.length() - 1; index >= 0; index--) {
            decimalValue += baseXNumeric(input.charAt(index)) * (Math.pow(base, placeValue));
            placeValue++;
        }

        return decimalValue;
    }

   private static char baseYCharacter(int input) {
        if (input >= 0 && input <= 9) {
            String str = String.valueOf(input);
            return str.charAt(0);
        } else {
            return  (char) ('a' + (input - 10));
            //return  ('A' + (input - 10));
        }
    }

    public static String decimalToBaseY(int input, int base) {
        String result = "";

        while (input > 0) {
            int remainder = input % base;
            input = input / base;
            result = baseYCharacter(remainder) + result;  // Important, Notice the reverse order here
        }

        return result;
    }

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.println("Enter : number baseX baseY");

        while(true) {
            String inputNumber = scanner.next();
            int inputBase      = scanner.nextInt();
            int outputBase     = scanner.nextInt();

            String outputNumber = convertBaseXtoBaseY(inputNumber, inputBase, outputBase);
            System.out.println("Result = " + outputNumber);
        }
    }
}