【问题标题】:Modified base36 to base 10 algorithm修改 base36 到 base 10 算法
【发布时间】:2017-02-21 21:36:30
【问题描述】:

我前段时间发布了一个关于从整数生成 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;
}

我正在尝试创建一种方法来扭转这种情况。 IE。给定一个字符串,例如 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。

有人可以帮忙吗? 谢谢

【问题讨论】:

  • 不同位数的base不同,不能使用pow。最不重要的数字是 n * 1,第二个是 n * 26,第三个是 n * 26 * 36。
  • 对不起,你能提供更多细节吗?从基数中减去 10 的第一个和最后一个字符的 if 语句不处理这个吗?
  • Math.pow(base, n) 如果你需要 26 * 36,base 是什么?

标签: java algorithm base36


【解决方案1】:

我会做这样的事情,假设字符串长度为 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;
}

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

【讨论】:

    【解决方案2】:

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

    检查每个字符是数字还是字母,然后转换为面值。数字是 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。

    【讨论】:

      猜你喜欢
      • 2018-03-19
      • 2022-01-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多