1、实现将10进制数字字符串转换为16进制数字字符串。如“155”,输出“0x9B”。要求不得使用任何第三方提供字符串与数字转换方法,如C语言的atoi,Java的String.ParseInt等等。
/**
* 十进制转十六进制
*/
public class Decimal2Hex {
public static String decimal2Hex(String num) {
BigDecimal decimal = new BigDecimal(num);
StringBuilder sb = new StringBuilder();
char[] hexs = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' };
BigDecimal decimal16 = new BigDecimal(16);
//除16取余过程,直到被除数为0
while (decimal.compareTo(BigDecimal.ZERO) != 0) {
//除16取余
sb.append(hexs[decimal.remainder(decimal16).intValue()]);
//除以16不进位
decimal = decimal.divide(decimal16, 0, BigDecimal.ROUND_DOWN);
}
//当传入的值为0时,直接返回0x00
if(sb.length() == 0) {
return "0x00";
}
//计算结果只要一位时,补一位0
if(sb.length() == 1) {
sb.append('0');
}
//倒置字符串
return "0x" + sb.reverse().toString();
}
}
2、随机给定两个超大整数,实现计算两数之乘积。如“111111111111111”和“222222222222222”,输出乘积“24691358024691308641975308642”。要求不使用Java中的BigInteger等类
/**
* 大整数相乘
*/
public class BigIntMultiply {
public static String multiply(String num1, String num2) {
//将字符串转为int数组
int[] num1Arr = string2IntArray(num1);
int[] num2Arr = string2IntArray(num2);
//保存结果
int[] result = new int[num1Arr.length + num2Arr.length];
//按位依次相乘,并且存入数组对于的位置
for (int i = 0; i < num1Arr.length; i++) {
for (int j = 0; j < num2Arr.length; j++) {
result[i + j + 1] += num1Arr[i] * num2Arr[j];
}
}
//处理进位
for (int i = result.length - 1 ; i > 0; i--) {
if(result[i] > 10) {
result[i - 1] += result[i] / 10;
result[i] %= 10;
}
}
//将结果转为String
return intArray2String(result);
}
private static int[] string2IntArray(String s) {
int[] res = new int[s.length()];
int i = 0;
for(char c: s.toCharArray()) {
res[i++] = c - '0';
}
return res;
}
private static String intArray2String(int[] arr) {
StringBuilder sb = new StringBuilder();
//如果首位是0,将0去掉
if(arr[0] != 0) {
sb.append(arr[0]);
}
for (int i = 1; i < arr.length; i++) {
sb.append(arr[i]);
}
return sb.toString();
}
}