题目描述:输入两个整数,要求输出这两个数的乘积。输入的数字可能超过计算机内整形数据的存储范围。
思路:
方法1:
1. 将乘数与被乘数逐位相乘;
2. 将逐位相乘得到的结果,对应相加起来。
3. 可以先不考虑进位,当所有位对应相加,产生结果之后,再考虑如果该位的数字大于10,那么我们用取余运算,在该位上只保留取余运算的结果,而将进位(通过模运算得到)累加到下一位便可。
方法2:
使用BigInteger类来处理大数据。
import java.util.Scanner;
public class TwoBigNumMulti {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc = new Scanner(System.in);
System.out.println("input num1:");
String s1 = sc.nextLine();
System.out.println("input num2");
String s2 = sc.nextLine();
int[] num1 = new int[s1.length()];
int[] num2 = new int[s2.length()];
for(int i=0;i<s1.length();i++){
num1[s1.length()-i-1] = s1.charAt(i) - '0'; // "12345"-> 5,4,3,2,1
}
for(int i=0;i<s2.length();i++){
num2[s2.length()-i-1] = s2.charAt(i) - '0';
}
int[] result = multi(num1, num2);
for(int i=result.length-1;i>=0;i--){
System.out.print(result[i]);
}
}
public static int[] multi(int num1[], int num2[]){
int len1 = num1.length;
int len2 = num2.length;
int[] result = new int[len1 + len2];
for(int i=0;i<len1;i++){
for(int j=0;j<len2;j++){
result[i+j] += num1[i]*num2[j];
}
}
for(int i=0;i<result.length-1;i++){
if(result[i] > 10){
result[i+1] += result[i]/10;
result[i] %= 10;
}
}
return result;
}
}
方法2:
package Alex.Huawei.Test;
import java.math.BigInteger;
import java.util.Scanner;
public class TwoBigNumMulti {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc = new Scanner(System.in);
System.out.println("input num1:");
String s1 = sc.nextLine();
System.out.println("input num2");
String s2 = sc.nextLine();
BigInteger b1 = new BigInteger(s1);
BigInteger b2 = new BigInteger(s2);
BigInteger result = multi1(b1, b2);
System.out.println(result.toString());
}
public static BigInteger multi1(BigInteger b1, BigInteger b2){
return b1.multiply(b2);
}
}
大整数乘法实现
本文介绍了一种处理超出标准整型数据范围的大整数乘法的方法。通过两种不同的技术实现:一是手动逐位相乘并处理进位,二是利用Java的BigInteger类简化操作。
1002

被折叠的 条评论
为什么被折叠?



