给定一个输入,我正在尝试编写一个程序来找到可以与该数字相关联的最小基数。例如,与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.我做错了什么?
答案 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;
}