Java版本的一个大数转换
原进制
oldBase = 16
目标进制
newBase = 10
目标字符串
s = "FF"
把字符串转换为数字数组
dividend = {15,15}
根据公式:
i 循环变量
r 上一次取余结果 , 若无则默认设置为0
t 被除数[i] + r * oldBase
q 商数组
t = dividend[i] + r*oldBase
q[i] = t / newBase
r = t % newBase
把商又给除数
商全部值为0
代码:
public class BaseNumberConversion {
public BaseNumberConversion() {
}
private int getCharToInteger(char c) {
if (c >= '0' && c <= '9')
return c - 48;
if (c >= 'a' && c <= 'f')
return c - 87;
return c - 55;
}
private char getIntegerToChar(int x) {
return (char) (55 + x);
}
public void to(int oldBase, int newBase, String s) {
int r, t, i;
int[] dividend = new int[s.length() * 2]; //被除数
int[] quotient = new int[s.length() * 2]; //商
int[] res = new int[s.length() * 2];// 余数
int dividendLength = 0, quotientLength, resLength = 0;//三个数组的长度
// 把字符串转换为数字数组
for (i = 0; i < s.length(); i++) {
dividend[dividendLength++] = getCharToInteger(s.charAt(i));
}
while (dividendLength != 0) {
r = 0;
quotientLength = 0;
for (i = 0; i < dividendLength; i++) {
t = dividend[i] + r * oldBase;//上一次 取余的结果*oldBase + 本次 被除数
quotient[quotientLength++] = t / newBase;
r = t % newBase;
}
i = 0;
dividendLength = 0;
res[resLength++] = r; //保存余数
while (i < quotientLength && quotient[i] == 0) {
i++;
}
if (i == quotientLength) {
break;
}
while (i < quotientLength) {
dividend[dividendLength++] = quotient[i];
quotient[i++] = 0;
}
}
// System.out.println(Arrays.toString(res));
//逆序
i = resLength - 1;
if (newBase == 16)
System.out.print("0x");
while (i >= 0) {
if (newBase == 16) {
System.out.print(getIntegerToChar(res[i--]));
} else {
System.out.print(res[i--]);
}
}
}
}