前段时间我发布了一个关于从整数生成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。
有人可以帮忙吗? 感谢
答案 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。