大数乘法
大数乘法乍一想可能比较复杂,因为乘法比起加法可能进位不光是1,还有两个数各种位置都需要相乘计算,这时候就需要我们化繁为简了。
多*多考虑起来可能有些麻烦,但是如果多*一考虑起来呢?如果是多位乘以一位数,那么就拿一位的分别乘以多位数的个位、十位、百位,在计算的同时考虑一下进位的情况。
但是也可以先直接用 int 类型数组存储各位的乘积然后从右向左进行进位,如下图所示。
而多*多 也是这个道理,将不同位乘积先叠加到对应位置上,然后从右向左进位,一直到不需要进位为止。
一个乘法流程
你可能会疑问,如果两个数组的长度分别为a和b这个数组到底该开多大呢?
a b大小就够了,怎么分析呢?其中一个a不变。另一个b变成最小b 1数字即十的倍数,那么这样在相乘的时候也不过是a b长度,所以这里a b长度就够了。
这题有力扣对应题可以去试试【43字符串相乘】,具体代码为:
public String multiply(String num1, String num2) {
if("0".equals(num1)||"0".equals(num2))return "0";
char a=num1.toCharArray;
char b=num2.toCharArray;
int value=new int[a.length b.length];
for(int i=a.length-1;i>=0;i--)
{
for(int j=b.length-1;j>=0;j--)
{
int index=a.length-1-i b.length-1-j;
value[index] =(a[i]-'0')*(b[j]-'0');
}
}
for(int i=0;i<value.length-1;i )
{
value[i 1] =value[i]/10;
value[i]=value[i];
}
int index=value.length-1;
while(value[index]==0)
{index--;}
StringBuilder sBuilder=new StringBuilder;
while (index>=0) {
sBuilder.append(value[index--]);
}
return sBuilder.toString;
}
大数除法
大数加减乘都搞定了,通过模拟来实现,但是大数除法也通过模拟来实现?
并不是,对于大数a/b,一般最多要求求到其整数解或者余数,即a/b=c……d(a,b,c,d均为整);也就是a里面有c个b,并且还剩下d。核心是先求c是多少,对于程序来说,可以通过枚举啊,将除法变成减法,从a中不断减d,一直到不能减为止。