写在前面:
我也是一名java语言的爱好者,仅以此文作为学习的记录,对于文中出现的代码规范,代码格式,算法效率等问题,希望各路大神不吝赐教,在下感激不尽。同是学习的同学也同样希望互相交流,取长补短。
——zsferrier@126.com
java基本类型中long的大小为64bit,能表示的最大整数为2的63次方-1。如果涉及到乘法运算数字超过这个值,显然就不能用长整形来表示,那么再不使用BigInteger的情况下,如何进行大数字的运算呢?
提供一种解决方式:利用数组模拟手工运算乘法的过程。
import java.util.Scanner;
public class Main {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner scanner = new Scanner(System.in);
//用字符串接受大数
String a = scanner.next();
String b = scanner.next();
//生成结果数组anwArray,数组的大小为输入两个字符串的长度之和
int[] anwArray = new int[a.length()+b.length()];
//两个for是模拟乘法运算
for(int i=0;i<a.length();i++){
for(int j=0;j<b.length();j++){
//p是产生的进位
int p = (a.charAt(a.length()-1-i)-'0')*(b.charAt(b.length()-1-j)-'0')/10;
//t是剩下的本位
int t = (a.charAt(a.length()-1-i)-'0')*(b.charAt(b.length()-1-j)-'0')%10;
//进位根据乘法运算法则加到对应位置
anwArray[a.length()+b.length()-2-i-j]+=p;
anwArray[a.length()+b.length()-1-i-j]+=t;
}
}
//调整结果,因为之前的运算所得到的结果数组中可能存在一位上是个多位数,接下来要把这些位该进位的进位。
for(int i=0;i<a.length()+b.length()-1;i++){
int p= anwArray[a.length()+b.length()-1-i]/10;
int t= anwArray[a.length()+b.length()-1-i]%10;
anwArray[a.length()+b.length()-i-2]+=p;
anwArray[a.length()+b.length()-i-1]=t;
}
//输出数组,要去除首部的0
int mx = 0;//设置标志位,直到遇到第一个非零数,将标志位置1,开始输出结果
for (int i = 0; i < anwArray.length; i++) {
if(anwArray[i]!=0){
System.out.print(anwArray[i]);
mx=1;
}else {
if(mx==1){
System.out.print(anwArray[i]);
}
}
}
}
}
与计算器的结果比对