题目链接:
http://www.k6k4.com/code/qshow/aannamwyg1509274910235
两个大整数相乘容易溢出,现将整数用字符数组表示,模拟整数相乘的过程。 如两个整数字符数组表示为: a = new char[]{'1', '9', '9'}, b = new char[]{'2', '9', '9', '9', '9'}, 结果为:c = new char[]{'5', '9', '6', '9', '8','0','1'}。 注:大整数首位不能为0
输入、输出描述
输入:
两个大整数的字符串表示形式,排列从高位到地位,如321 的数组表示形式:new char[]{'3', '2', '1'}
输出:
两个大整数相乘结果的字符数组表示形式,首位不能为0
Example
输入:
a = new char[]{'1', '9', '9'} b = new char[]{'2', '9', '9', '9', '9'}
输出:
c = new char[]{'5', '9', '6', '9', '8','0','1'}
---------------------华丽分割线-----------------------
解题思路:
采用两层for循环,按照正常乘法计算方法,从低位数字开始循环,注意这里低位对应的是数组的高位。具体方法可以参考代码里的注释。
import java.util.*;
public class Main {
public char[] solution(char[] a,char[] b) {
int length1 = a.length;
int length2 = b.length;
//两数相乘结果的长度不会超过两数位数之和,可以创建如下数组保存中间计算结果
int[] temp = new int[length1+length2];
//按照正常乘法计算方法,从低位开始循环,对应数组的高位
//第一个数按位循环
for(int i=0;i<length1;i++) {
//得到最低位的数字
int num1=a[length1-1-i]-'0';
//保存进位
int tmp=0;
//第二个数按位循环
for(int j=0;j<length2;j++) {
int num2=b[length2-1-j]-'0';
//拿出此时的结果数组里存的数+现在计算的结果数+上一个进位数
tmp=temp[i+j]+num1*num2+tmp;
//得到此时结果位的值
temp[i+j]=tmp%10;
//此时的进位
tmp/=10;
}
//第一轮结束后,如果有进位,将其放入到更高位
temp[i+length2]=tmp;
}
int resultLength = length1+length2-1;
while (resultLength>0 && temp[resultLength]==0) {
resultLength--;
}
char[] result = new char[resultLength+1];
int index = 0;
while (resultLength>=0) {
result[index] = (char) (temp[resultLength--]+'0');
index++;
}
return result;
}
}
欢迎加“算法刷题交流QQ群(474397739)”一起研究讨论算法