1. 前言
今天做了一家公司的在线笔试题,其中有道算法蛮有意思的,在此记录并拓展下知识点,以备以后复习之用。
题目:
Java中两个大整数(超过了long的表示范围)相加,不能用java已用的工具类。
2. 分析
既然long都表示不下了,那就是String来记录了,将String类型转为char数组,然后两个数的个位,十位等对齐相加,最终结果再转为String类型。
本题想考察的第一点应该是用String来记录超过范围的整数,第二个关键点就是char数组的对位相加求和。
3. 代码
package test;
/**
* 两个大整数求和(超过long的表示范围)
*
* 思路:将整数转为String字符串,字符每位相加判断
*
* @author shu jun
* @date 2018-8-19 15:25
*
*/
public class Test1 {
public static String addBigNum(String num1, String num2) {
//1. String转为char数组
//因为num1, num2 可能位数不一样,比如num1=123, num=1234, 翻转两个字符串后,个位十位相加比较方便
char[] num1Chars = new StringBuffer(num1).reverse().toString().toCharArray();
char[] num2Chars = new StringBuffer(num2).reverse().toString().toCharArray();
int num1Length = num1Chars.length;
int num2Length = num2Chars.length;
//2. 在长的数组长度上加一来存新数组
int maxLength = num1Length;
if (num2Length > num1Length)
maxLength = num2Length;
int[] result = new int[maxLength + 1];
//3. 对位相加
for (int i = 0; i < result.length; i++) {
// 如果当前的i超过了某个数组的长度,就用0代替高位了,和另一个字符数组中的数字相加
int aint = i < num1Length ? (num1Chars[i] - '0') : 0;
int bint = i < num2Length ? (num2Chars[i] - '0') : 0;
//result[i]可能已经有值了,是前面一位运算(i-1)进位过来的,所以不能直接赋值,要 +=
result[i] += aint + bint;
//如果大于10的就向前一位进位,本身进行除10取余
if (result[i] >= 10) {
result[i + 1] += result[i] / 10;
result[i] %= 10;
}
}
//4. 存储最后的结果
StringBuffer sb = new StringBuffer();
//判断最高位是0还是1, 0无需保存
if (result[result.length-1] == 1)
sb.append(1);
for (int i = result.length-2; i >= 0; i--) {
sb.append(result[i]);
}
return sb.toString();
}
public static void main(String[] args) {
// TODO Auto-generated method stub
String num1 = "11111111111111111111111111111";
String num2 = "99999999999999999999999999999";
String result = addBigNum(num1, num2);
System.out.println("result: " + result);
}
}
- 拓展
java八种基本类型
- 四种整数类型(byte、short、int、long)。
Byte一个字节,short 2个字节,int 4个字节,long 8个字节。 - 两种浮点数类型(float、double)
Float 4个字节,double 8个字节 - 一种字符类型(char),2个字节;
- 一种布尔类型,1位,一个字符。
比如long的长度是固定的,不随jdk32位/64位,windows 32/64而改变。
Java测试Long的最大长度