与数字相关联的最小基数

时间:2015-01-17 05:29:23

标签: java algorithm base

给定一个输入,我正在尝试编写一个程序来找到可以与该数字相关联的最小基数。例如,与385相关联的最小基数是base-9(因为它需要具有支持数字8的基数,该数字8是其最高值数字)。类似地,与B95相关的最小基数是base-12,因为它使用0 -9和A和B.

这是我的代码

public static int findBase(String str){

            int max = 0;
            char c;
            for (int i = 0; i <str.length() ; i++) {
                c = str.toUpperCase().charAt(i);
                if (Character.isDigit(c) && c > max) {
                    max = c;
                }else if (Character.isLetter(c)) {
                    max = 10 + (c - 'A');
                }
            }

            return max + 1;

        }

问题是该函数返回随机值。例如,对于值385,它返回56.我做错了什么?

1 个答案:

答案 0 :(得分:1)

问题是你在使用字符的unicode值时会使用该字符。

而不是:

max = c;

......你应该使用:

max = c - '0';

另请注意,Character.isLetter会返回true所有unicode字母,包括阿拉伯字母和其他字母的字母,其中包含更高的unicode代码点值;同样适用于Character.isDigit

在您的情况下,您只能处理ASCII字符集中的拉丁字符,因此为了安全起见,最好特别检查一下。 并且您没有正确检查最大值(您将unicode代码点与最大值进行比较,而不是转换后的值)

            int v = 0;
            if (c >= '0' && c <= '9') {
                v = c - '0';
            } else if (c >= 'A' && c <= 'Z') {
                v = 10 + (c - 'A');
            }
            if (v > max) {
                max = v;
            }

完整计划:

public static int findBase(String str) {
    int max = 0;
    str = str.toUpperCase();
    for (int i = 0; i < str.length(); i++) {
        char c = str.charAt(i);
        int v = 0;
        if (c >= '0' && c <= '9') {
            v = c - '0';
        } else if (c >= 'A' && c <= 'Z') {
            v = 10 + (c - 'A');
        }
        if (v > max) {
            max = v;
        }
    }
    return max + 1;
}