超出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)); } }
相关文章推荐
- java基本类型(数值范围):浮点的底层表示定义,float计算快一些
- java十进制数字转十六进制(int类型太大无法转换,把int类型转为Long类型计算)
- oracle number类型的数值存储空间是几个字节?
- java、MySQL时间类型的转换及存储(Timestamp、Date、String、Long)
- C/C++中int/long/float/double数值类型与字符串互相转换[总结]
- JAVA 各种数值类型最大值和最小值 Int, short, char, long, float,&nbs
- 计算char,short,int,long类型变量的取值范围
- 获取Linux系统short、int、long等各种数值类型最大最小值
- 在Asp中使用存储过程数值类型值
- 编写一个程序以确定分别由signed及unsigned限定的char、short、int及long类型变量的取值范围。采用打印标准头文件中的相应值以及直接计算两种方式实现
- PHP中字符串类型与数值类型混合计算
- Java中不同数值类型间转换与计算精度丢失问题
- 计算char,short,int,long类型变量的取值范围
- MySql Blob图片类型存储Bug解决:索引超出了数组界限错误
- python 四种数值类型(int,long,float,complex)介绍
- SQL SERVER 数值类型的存储格式及转换
- Java 里使用 long 类型的数据一定要在数值后面加上 “L”
- java中如何将String类型的日期转换成数值及计算
- C/C++中int/long/float/double数值类型与字符串互相转换[总结]