NC10:大数乘法
大数乘法
http://www.nowcoder.com/questionTerminal/c4c488d4d40d4c4e9824c3650f7d5571
将输入的两个大数以字符串的形式存储,然后转化成整型数组存储,通过整型数组进行乘法运算(采用分治的思想)
即乘法分配律,如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(); } }
名企高频面试算法题解 文章被收录于专栏
牛客题霸 - 程序员面试高频题 - 题解