修改base36到base 10算法

时间:2017-02-21 21:36:31

标签: java algorithm base36

前段时间我发布了一个关于从整数生成6个字符base36字符串的算法的问题。它有一个限制,即第一个和最后一个字符必须始终是一个字母,整个字符串都是大写。

以下是算法:

String getId(int id)
{
    String s = "";
    for(int i = 0; i < 6; i++)
    {
        int digit;
        if((i == 0) || (i == 5))
        {
            digit = (id % 26) + 10;         
            id /= 26;
        }
        else
        {
            digit = id % 36;
            id /= 36;
        }

        // add the digit to the string:
        if(digit < 10)
            s = (char)('0' + digit) + s;
        else
            s = (char)('A' + (digit - 10)) + s;
    }
    return s;
}

我正在尝试创建一个反转此方法的方法。即给定一个字符串,如A0000K,它将返回10.这是我到目前为止:

static int getNumber(String id) {
    int base = 36;
    int result = 0;
    int n = id.length();
    for (int i = 0; i < id.length(); i++)
    {
        n-=1;
        int digit = Character.digit(id.charAt(i), base);        

        if(i == 0 || i == 5) {
            result += digit * (Math.pow(base-10, n));
        }
        else {
            result += digit * (Math.pow(base, n));
        }

    }

    return result;
}

我认为问题在于计算结果的if语句,但我不太清楚如何计算它。我基于标准算法,从其他基地转换为基数10。

有人可以帮忙吗? 感谢

2 个答案:

答案 0 :(得分:0)

我会做这样的事情,假设字符串长度为6个字符,以简化:

static int getNumber(String id) {
    int sum = 0, val;
    char current;
    for(int i = 0; i < 6; i++) {
        current = id.charAt(i);
        val = ((int) current) - (int) 'A';
        if(val > 0){
            sum += (val + 10) * Math.pow(36,5-i);
        } else {
            sum += ((int) id.charAt(i)) * Math.pow(36,5-i);
        }
    }
    return sum;
}

我没有测试过它,但它应该可以工作,或者至少非常接近。 如果您仍然遇到困难,请尝试在调试器中单步执行。

答案 1 :(得分:0)

如果从最不重要的位置迭代到最重要的位置,跟踪每个数字/字母的位置值,将会更容易。

检查每个字符是否为数字或字母,然后转换为面值。数字是0-9,字母是10-35,除了第1和第6位,它们的价值减去10。

将面值乘以位值并添加到结果中。通过乘以26或36来增加位置值,具体取决于位置。

static int getNumber(String id) {
    int placevalue = 1;
    int result = 0;
    for (int i = id.length()-1; i >= 0; i--)
    {
        int facevalue;
        if(Character.isDigit(id.charAt(i)))
            facevalue = (int)id.charAt(i) - '0';
        else
            facevalue = ((int)id.charAt(i) - 'A') + 10;

        if(i == 0 || i == 5) {
            result += (facevalue - 10) * placevalue;
            placevalue *= 26;
        }
        else {
            result += facevalue * placevalue;
            placevalue *= 36;
        }
    }

    return result;
}

以上内容并未进行任何输入验证。至少你应该检查id.length是否为6。