您的位置:首页 > 编程语言 > Java开发

大整数乘法原理(JAVA)

2013-09-27 11:21 204 查看
在JAVA中int的字长变成了32位,但是对于两个上亿的数来说,让这两个数相乘,就会超出她的范围,有人会说那就用Long型,对于Long型,当两大于10亿数相乘,就会超出她的范围,有人会说那就用Double型,这也是一种解决办法,他有两个缺点,①对于两个太大的数,他就会用科学计数法来表示,你就不能看到她的全部部分,只能看到,例如:9.198429228235586E307前几位数字,这并不是我们想看到的,②他最多能到10的308次方,不能再向上了,但是对于大多数人还是可以的,但是第一个缺点很麻烦,那如何计算大整数乘法呢,让我们模拟计算机的乘法原理。小学时的乘法原理。

1 1

*

1 1

1 1

+1 1

1 2
1即可

代码如下:

ackage com.temp;

import java.util.Arrays;

public class Cheng {

/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub

Cheng cheng=new Cheng();
cheng.cheng();
}

public void cheng()
{
int jin=0;//进位标志
byte []c1=new byte[300];//第一个数的大小(上面的乘数)
byte []c2=new byte[300];//第一个数的大小(下面的乘数)
byte []c3=new byte[400];//乘积的结果
String s1="1234567891111";//第一个数
String s2="98765432111";//第二个数
//我们在计算时,常常将短的写在下面		即11*120		我们往往将120写在上面,将11写在下面
//交换两个数
if(s1.length()<s2.length());{
String temp=s1;
s1=s2;
s2=temp;
}
//将第一个数放入到c1中
for(int i=s1.length()-1;i>=0;i--){
c1[s1.length()-1-i]=(byte) (s1.charAt(i)-'0');
}
//将第二个数放入到c2中
for(int i=s2.length()-1;i>=0;i--){
c2[s2.length()-1-i]=(byte) (s2.charAt(i)-'0');
}
//循环相乘
int i=0;
int j=0;
for(i=0;i<s2.length();i++){
//进位清零
jin=0;
for(j=0;j<s1.length();j++){
//让两个数相乘并加上进位
int temp= (c2[i]*c1[j]+jin);
//得到进位
jin=temp/10;
//将余数放入到指定位置(两个数相乘正好等于第一数的位置+第二个数的位置)
c3[i+j]+=(byte) (temp%10);
//当这一位大于等于10时,说明他有进位
if(c3[i+j]>=10){
temp=c3[i+j];
//将余数放入到指定位置(两个数相乘正好等于第一数的位置+第二个数的位置)
c3[i+j]=(byte) (temp%10);
//进位+=进位
jin+=temp/10;
}
}
//当小循环结束,当进位大于零,说明他向前有进位
if(jin>0){
//得到进位
c3[i+j]=(byte) jin;
}
}
//当大循环结束,进位大于零,说明他向前有进位,
if(jin>0){
c3[i+j-1]=(byte) jin;
}
//打印结果。两个数相乘不可能大于这两个数的长度相加
boolean b=true;
for(i=s1.length()+s2.length();i>=0;i--){
if(b){
if(c3[i]!=0){
System.out.print(c3[i]);
b=false;
}
}
else{
System.out.print(c3[i]);
}
}
}

}

仅供参考,如果某个大师有更好的算法,向我分享一下。我感激不尽,
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  算法 大整数乘法