将输入的两个大数以字符串的形式存储,然后转化成整型数组存储,通过整型数组进行乘法运算(采用分治的思想)
即乘法分配律,如AB*CD=AC(AD+BC)BD,将两个数组逐位相乘的结果对位存放在新的数组里,再对新数组进行进位判定,进位结束后将新数组转化成字符串输出。
import java.util.*;
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
* @param s string字符串 第一个整数
* @param t string字符串 第二个整数
* @return string字符串
*/
public String solve (String s, String t) {
// write code here
int[] arr1=new int[s.length()];
for(int i=0;i<s.length();i++){
arr1[i]=s.charAt(i)-'0';
}
int[] arr2=new int[t.length()];
for(int i=0;i<t.length();i++){
arr2[i]=t.charAt(i)-'0';
}
int len1=arr1.length;
int len2=arr2.length;
// 开辟结果数组,结果长度至多为 lenOne + lenTwo
int[] result=new int[len1+len2];
// 开始计算,先不考虑进位,每次结果存在result[i + j + 1]位置
// 为什么是i + j + 1?
// 因为结果数组计算处理高位在数组左,低位在数组右。
//i+j+1实际上是往低位存,这样后面进位处理才正确
for(int i=0;i<len1;i++){
for(int j=0;j<len2;j++){
result[i+j+1]+=arr1[i]*arr2[j];
}
}
int carry=0;
for(int i=result.length-1;i>=0;i--){
int sum=carry+result[i];
result[i]=sum%10;
carry=sum/10;
}
// 转为String,需要无视前置0
//如果最终res长度为0,则代表输入类似"0" "0"的用例,结果应该输出“0”
StringBuffer res=new StringBuffer();
int cur=0;
while(cur<=result.length-1 && result[cur]==0){
cur++;
}
for(int i=cur;i<result.length;i++){
res.append(result[i]);
}
return res.length()==0 ? "0" : res.toString();
}
}
京公网安备 11010502036488号