大数相乘
题目:有两个用字符串表示的非常大的大整数,算出他们的乘积,也是用字符串表示。不能用系统自带的大整数类型。
例子:
输入 :72106547548473106236 982161082972751393
输出:70820244829634538040848656466105986748
前言
今天值得记录的小事:
(1) 第一次吃日料,39块一碗的豚骨面,有点贵,里面也没啥肉,不过味道不错!
(2) 和大学舍友去看了七龙珠,还不错。悟空真的是强的变态,性格还是和以前一样,沉稳中带着调皮。
思路
本题的思路其实很直接就是把两个数的乘法用代码模拟出来!思路简单,做起来还是很难的!!!
关于两个大数的乘法
主要方法:
(1)将每一位做乘法,然后对应相加。此时不考虑进位。用数组来存储这些值,记得第一个数从数组的第二个位置开始存,因为第一个位置要考虑到进位。
(2)单独考虑进位
完整的代码
import java.util.Scanner;
/*
* 题目:大整数相乘
* 用两个字符串表示的非常大的大整数,算出他们的乘积,也是用字符串表示。不能用系统自带的大整数类型。
* */
public class mianshiti3 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner scan=new Scanner(System.in);
String num1=scan.nextBigDecimal().toString();
String num2=scan.nextBigDecimal().toString();
StringBuffer sb=new StringBuffer();
int len1=num1.length();
int len2=num2.length();
int [] arr1=new int [len1];
int [] arr2=new int [len2];
for(int i=0;i<len1;i++) {
arr1[i]=Integer.parseInt(num1.charAt(i)+"");
}
for(int i=0;i<len2;i++) {
arr2[i]=Integer.parseInt(num2.charAt(i)+"");
}
int [] arr3=new int [len1+len2];
/*两个大数相乘的算法
* 9 8
* * 2 1
* --------------
* 9 8
* 18 16
* ---------------
* 18 25 8
* 先不进位,最后一步进位
*/
for(int i=0;i<arr1.length;i++) {
for(int j=0;j<arr2.length;j++) {
arr3[i+j+1]=arr3[i+j+1]+arr1[i]*arr2[j];
}
}
//单独表示进位
for(int i=arr3.length-1;i>0;i--) {
if(arr3[i]>=10) {
arr3[i-1]=arr3[i-1]+arr3[i]/10;
arr3[i]=arr3[i]%10;
}
}
for(int i=0;i<arr3.length;i++) {
if(i==0&&arr3[i]==0) {
continue;
}
sb.append(arr3[i]);
}
System.out.print(sb);
}
}
值得注意的知识点
(1)用Scanner读取大的整数的方法:scan.nextBigDecimal().toString();
(2)数组的第一个位置可能为0,要考虑进去,比如12*34,就可能输出0408,结果是不正确的!