[编程题]大整数相乘
- 时间限制:1秒 空间限制:32768K
有两个用字符串表示的非常大的大整数,算出他们的乘积,也是用字符串表示。不能用系统自带的大整数类型。
输入描述:
空格分隔的两个字符串,代表输入的两个大整数
输出描述:
输入的乘积,用字符串表示
示例1
输入
72106547548473106236 982161082972751393
输出
70820244829634538040848656466105986748
分析:
大整数相乘模拟我们平时算乘法的过程,先写个函数:被乘数是一个字符,然后在编写个大整数相加的函数。最后每次遍历被乘数就好。
import java.util.*;
/**
* @program: 个人demo
* @description: LeetCode练兵场
* @author: Mr.Hu
* @create: 2019-03-01 21:10
*/
public class Main{
public static void main(String[] args) {
Scanner sc =new Scanner(System.in);
while (sc.hasNext()){
StringBuilder s1=new StringBuilder(sc.next());
StringBuilder s2=new StringBuilder(sc.next());
StringBuilder re=new StringBuilder();
for (int i = s1.length()-1; i >=0; i--) {
StringBuilder temp=multiply(s2,s1.charAt(i));
for (int j = i; j < s1.length()-1; j++) temp.append('0'); //乘出来的结果别忘了升级(加0000)
re=add(re,temp);
}
System.out.println(re);
}
}
public static StringBuilder multiply(StringBuilder s, char c){
StringBuilder re=new StringBuilder();
int carry=0;
for (int i = s.length()-1; i >=0 ; i--) { //乘法
int temp=(s.charAt(i)-'0')*(c-'0')+carry;
re.append((char)(temp%10+'0'));
carry=temp/10;
}
if (carry!=0) re.append((char)(carry+'0'));
return re.reverse();
}
public static StringBuilder add(StringBuilder s1, StringBuilder s2){
s1=s1.reverse();s2=s2.reverse(); //反转方便相加
StringBuilder re=new StringBuilder();
while (s1.length()<s2.length()) s1.append('0'); //补齐字符串方便相加++++ 加法的麻烦之处
while (s1.length()>s2.length()) s2.append('0');
int carray=0;
for (int i =0 ; i <s1.length() ; i++) {
int temp=s1.charAt(i)-'0'+s2.charAt(i)-'0'+carray; //别忘了加上进位
re.append((char) (temp%10+'0'));
carray=temp/10;
}
if (carray!=0) re.append((char)(carray+'0'));
return re.reverse();
}
}