0

前段时间我发布了一个关于从整数生成 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 的标准算法。

任何人都可以帮忙吗?谢谢

4

2 回答 2

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;
}

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

于 2017-02-21T22:15:10.780 回答
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。

于 2017-02-21T23:18:33.817 回答