大整数乘法原理(JAVA)

在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]);
			}
		}
	}
	
}
仅供参考,如果某个大师有更好的算法,向我分享一下。我感激不尽,

你可能感兴趣的:(算法,大整数乘法)