您的位置:首页 > 其它

超出long类型存储数值的超大计算

2011-12-19 10:19 274 查看
package com.test;

/**
 * 发散
 * 
 * 如果定义的两个整数超出了
 * 或是其和超出了long类型
 * 如何正确相加,返回正确结果
 * 
 * @author leiwei 2011-12-16
 *
 */
public class AddDemo {

	public static void main(String[] args) {
		String oneNum = "123456789123456789123456789123456789";
		String twoNum = "123456789123456789123456789";

		String rs = add(oneNum,twoNum);
		
		System.out.println(rs);
	}

	private static String add(String oneNum, String twoNum) {
		String result = "";
		
		//无论传进来的数据长度是否相等,我们都是他相等
		int ontLength = oneNum.length();
		int twoLength = twoNum.length();

		int maxLength = (ontLength > twoLength)?ontLength:twoLength;
		int minLength = (ontLength < twoLength)?ontLength:twoLength;

		String strTemp = "";

		//看最大数据和最小数据相差多少位,位补多少个0
		for(int i=maxLength-minLength;i>0;i--)

		{
			strTemp+="0";
		}

		//把长度调整到相同,谁最长,就在对方身上补0
		if(maxLength == ontLength){
			twoNum = strTemp + twoNum;
		}else{
			oneNum = strTemp + oneNum;
		}

		//我们知道,一串数据每一位最大值是9,即使是9+9,进位数也是1,
		//刚刚开始个位相加是不需要进位的,故此为jw=0
		int jw = 0;
		
		//相加处理,从右向左(如 12+32 先进行2+2 再进行3+1)
		for (int i = maxLength-1; i >= 0 ; i--) {
			int tempOneNum=Integer.parseInt(String.valueOf(oneNum.charAt(i)));
			int tempTwoNum=Integer.parseInt(String.valueOf(twoNum.charAt(i)));

			//相加、进位之后每个位置上,留下的数据(如9+9余下8)
			int sumAfterNum = 0;
			
			/**
			 * i=0表示最左端的一个数据
			 * 
			 * 如果对应位置上的(tempOneNum + tempTwoNum + jw)>=10 && i!=0 执行if
		     * 如果(tempOneNum + tempTwoNum + jw)>=10 && i=0 执行else
		     * 直接返回tempOneNum+tempTwoNum+jw就可以了
			 */
			if((tempOneNum + tempTwoNum + jw)>=10 && i!=0){
				
				sumAfterNum = (tempOneNum + tempTwoNum + jw) -10;
				jw = 1;
			}else{
				sumAfterNum = (tempOneNum + tempTwoNum + jw);
				jw = 0;
			}
			
			result = String.valueOf(sumAfterNum) + result; 
		}

		return result;
	}
}
package com.test;

import java.math.BigDecimal;

/**
 * 发散
 * 
 * 如果定义的两个整数超出了
 * 或是其和超出了long类型
 * 如何正确相加,返回正确结果
 * 
 * @author leiwei 2011-12-16
 *
 */
public class JJCC {

	public static void main(String[] args) {
		BigDecimal a=new BigDecimal(new String("123453243455535634535252345234677576252241234123523453664563634"));
		BigDecimal b=new BigDecimal(new String("123453243455535634535252345234677576252241234123523453664563634")); 
		String c=a.add(b).toString();//加 
		String d=a.subtract(b).toString();//减 
		String e=a.multiply(b).toString();//乘 
		String f=a.divide(b).toString();//除 
		
		System.out.println(c);
		System.out.println(d);
		System.out.println(e);
		System.out.println(f);
	}
}


package com.java.utils;

import java.math.BigDecimal;
import java.util.Scanner;

/**
 * 
 *  代码中相乘的两数都是String字符串,要求相乘的两个数都是非负整数,
 *  如果带符号的话,只需要添加个符号判断就可以了。 
 *
 */
public class Multiply
{
	public String mul(String str1,String str2)
	{
		StringBuffer bstr=new StringBuffer();
		int i=0,j=0;
		for(i=0;i<str1.length()+str2.length();i++)
		{
			bstr.append('0');
		}
		int k=bstr.length()-1,add=0,temp=0;
		for(j=str2.length()-1;j>=0;j--)
		{
			if(str2.charAt(j)!='0')
			{
				for(i=str1.length()-1;i>=0;i--)
				{
					k=i+j+1;
					temp=(str2.charAt(j)-'0')*(str1.charAt(i)-'0')+(bstr.charAt(k)-'0');
					bstr.setCharAt(k--, (char)('0'+temp%10));
					add=temp/10;
					while(add!=0)
					{
						temp=add+bstr.charAt(k)-'0';
						bstr.setCharAt(k--, (char)('0'+temp%10));
						add=temp/10;
					}
				}
			}
		}
		return bstr.substring(firstNotZeroIndex(bstr));
	}
	
	private int firstNotZeroIndex(StringBuffer str)
	{
		for(int i=0;i<str.length();i++)
			if(str.charAt(i)!='0')
				return i;
		return str.length()-1;
	}
	
	public static void main(String[] args)
	{
		Multiply mul=new Multiply();
		Scanner cin=new Scanner(System.in);
		System.out.print("请输入第一个整数:");
		String str1=cin.next();
		System.out.print("请输入第二个整数:");
		String str2=cin.next();
		System.out.print("结果是:");
		System.out.println(mul.mul(str1, str2));
	}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: