import java.math.BigInteger;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class BigIntegerAddition {
/**
* 题目:java实现两个大数相加,可能存在溢出。
* 如123456789 + 987654321 返回 1111111110
* 1.直接用BigInteger
* 2.模拟手算加法,进位相加(暂时没有考虑负数的情况)
*/
public static void main(String[] args) {
String x="23456789";
String y="987654321";
//use BigInter
BigInteger a=new BigInteger(x);
BigInteger b=new BigInteger(y);
BigInteger c=a.add(b);
System.out.println(c.toString());
//"reinvent the wheel"
String d=add(x,y);
System.out.println(d);
}
//return x+y. Have not considered the negative number yet.
public static String add(String x,String y){
if(x==null||y==null){
return null;
}
if(!isNumeric(x)||!isNumeric(y)){
return null;
}
if(x.equals("0")){
return y;
}
if(y.equals("0")){
return x;
}
if(x.length()>y.length()){
String tmp=x;
x=y;
y=tmp;
}
x=addZeroToFirst(x,y.length());
String z=addHelp(x,y);
return z;
}
public static String addHelp(String x,String y){
String z="";
int len=x.length();
int[] a=toIntArray(x);
int[] b=toIntArray(y);
int[] c=new int[len+1];
int d=0;//to carry. No need to use int[]
for(int i=0;i<len;i++){
int tmpSum=a[len-1-i]+b[len-1-i]+d;
c[len-i]=tmpSum%10;
d=tmpSum/10;
}
c[0]=d;
StringBuilder sb=new StringBuilder();
for(int i=0;i<=len;i++){
sb.append(c[i]);
}
if(c[0]==0){//delete the first '0' in result string
z=sb.substring(1);
}else{
z=sb.toString();
}
return z;
}
//String - toCharArray - toIntArray
public static int[] toIntArray(String str){
int len=str.length();
int[] result=new int[len];
for(int i=0;i<len;i++){
result[i]=str.charAt(i)-'0';
}
return result;
}
//("123",5)-->"00123"
public static String addZeroToFirst(String str,int length){
StringBuilder sb=new StringBuilder();
int diff=length-str.length();
while(diff>0){
sb.append("0");
diff--;
}
sb.append(str);
return sb.toString();
}
public static boolean isNumeric(String str){
Pattern p=Pattern.compile("[0-9]*");
Matcher isNum=p.matcher(str);
return isNum.matches();
}
}
分享到:
相关推荐
字符串实现大数相加,首先两个数是用计算机的位数不能表示出来的,然后我们用字符数组进行操作!
java实现大数相加,在不使用BigInteger工具的前提下实现大数相加
大数相乘算法,java代码,包含独立大数相加算法 其中bigNumberPlus(String s1,String s2)为大数相加方法 bigNumberMultiply(String s1,String s2)为大数相乘方法
采用单链表的做的,以一万分界点,每个节点有四位数
C++实现大数加减乘数
主要介绍了java编程实现两个大数相加代码示例,具有一定参考价值,需要的朋友可以了解下。
该资源是用C语言编写两个超过100位的大数相加
使用string类型实现大数...先将两个加数存为String类型,再从两个加数的末尾开始,一个数一个数的相加,跟做普通加法一个原理,只是这里需要注意的是,两个加数的类型为字符串,需要相应的转换才能相加,在代码有描述。
分享一下用C/C++实现的大数相加和大数相乘,可以拿来当工具用。
用c++编写的大数相加,可以实现任意两个长度的大数相加求和。
利用字符串实现大数相加,代码在VS2005 中可用
该文件为C/C++课程对于大数相加问题的解决, /*大数相加*/ /*在一般语言中对整型数都有个最大限制, 先给出两个超出正常范围的十进制数 对其进行求和,带进位的加法*/
用栈实现了两个大数相加,解决了long类型的越界问题,用于学习数据结构,C++实现的demo,内含源代码,可以运行。
C++实现的大数相加,有很好的类的封装性
利用链表实现大数相加
java实验大数相加
用Java语言实现一个大数类,主要是大数的加减功能,是实现大数类
js代码-两个大数相加
用C语言和链表编写的大数相加程序,想学链表的不要错过,程序里的不足请多指教
C/C++实现两个大数相乘的源代码,同理可以实现两个无限小数的相乘,实现原理都是一样的。看代码就能写出来。