在网上无意间看了一道简单的面试题,题目:计算两个超大整数的和,计算的结果超过int类型的范围
首先,遇到这种情况的话,思路一般为是将数字转换为其他类型,然后进行计算,那么这道题的做法就可以将数字转换为字符串进行下一步的求解。
具体的代码如下:
public class Test {
private static String calculate(String str) {
String data="";//data用来存放最后计算的结果
String[] split = str.split("\\+");//按照+号将字符串分隔
if(split.length!=2){
System.out.println("输入有误");
return "输入有误 ,无返回值";
}
int index1=split[0].length()-1;//存第一个数组里面字符串的长度
int index2=split[1].length()-1;//存第二个数组里面字符串的长度
String str1=split[0];//将字符串拿出来转换为字符数组
char[] charArray1 = str1.toCharArray();
String str2=split[1];
char[] charArray2 = str2.toCharArray();
/**
* 始终让第一个字符串的长度大于等于第二个字符串
*/
if(index1<index2){
int temp=index1;
index1=index2;
index2=temp;
char [] aa=charArray1;
charArray1=charArray2;
charArray2=aa;
}
int left=0;//这个标记用于向上进位,初始值为0
while(index2>=0){
int sum=0;//末尾两个数相加
int a1=(int)(charArray1[index2]-'0');//将字符转换为数值
int a2=(int)(charArray2[index2]-'0');
sum=a1+a2+left;//将两个数相加,并加上进位
if(sum>=10)//向上进位
{
left=1;
}
else{
left=0;//不进位
}
/**
* 将每次计算得到的结果放到data的前面
*/
String temp=(sum%10)+data;
data=temp;
index2--;
index1--;
}
/**
* 继续计算较长那个串的值
*/
while(index1>=0){
int sum=0;
int a1=(int)(charArray1[index1]-'0');
sum=a1+left;
if(sum>=10)
{
left=1;
}
else{
left=0;
}
String temp1=(sum%10)+data;
data=temp1;
index1--;
}
/**
* 将最长的计算了之后,还需要把大于0的进位符加在结果的前面
*/
if(left>0){
String temp1=left+data;
data=temp1;
}
return data;
}
public static void main(String[] args) {
String string="99999999999999999999+1111111111111111111111111111111111111";
System.out.println(calculate(string));
String
string1="22222222222222222222123222222222222222+11111112331231211111111111111";
System.out.println(calculate(string1));
}
}
测试代码计算结果如下:
分享到此结束,代码的正确性读者可自行测试,有什么疑问请call me!!!!!谢谢您的阅读。