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();
}
}
分享到:
相关推荐
对于两个大数 `a` 和 `b`,我们可以创建一个与 `a` 和 `b` 长度相同的数组来存储每一位,然后从最低位开始逐位相加,并处理进位。 以下是一个简单的算法描述: 1. 初始化两个大数 `a` 和 `b` 为字符串形式,按位...
两个大数相加时,可以类似小学的竖式加法,逐位相加并考虑进位。这里需要遍历两个数组,从低位到高位进行加法运算: 1. 初始化一个新的数组用于存放结果。 2. 初始化进位值为0。 3. 遍历两个数组,对于对应位上的...
* 数学运算:BigInteger类可以用于实现各种数学运算,如大数相加、减、乘、除等。 * 数据处理:BigInteger类可以用于处理大型数据,如数字识别、数据分析等。 BigInteger类是Java中的一种非常有用的大数运算类,它...
在大数比较中,`COMPARE_BIG_NUM`函数比较两个大数的大小。它从最低位开始逐位比较,如果在某一位上找到不相等的数字,就返回相应的标志(1表示第一个大数更大,0表示第二个大数更大)。如果所有位都相等,那么两个...
例如,如果两个大数是“1234”和“5678”,我们可以将其转换为数组形式[1, 2, 3, 4]和[5, 6, 7, 8],然后逐位相加,注意进位。 减法与加法类似,只是需要处理借位。在大数减法中,如果高位的被减数小于减数,就需要...
1. **加法**:对两个大数进行相加,确保结果能正确处理进位,以避免溢出问题。 2. **减法**:类似地,进行大数的减法运算,需要注意负数的表示以及借位的处理。 3. **乘法**:大数乘法通常使用Karatsuba算法或更...
在实际应用中,可能需要考虑性能优化,因为上述递归实现对于大数可能会导致栈溢出。可以改用循环实现阶乘计算,以减少递归调用: ```java public static long iterativeFactorial(int n) { long result = 1; for ...
一种方法是将小数部分作为另一个大数处理,另一种是使用定点数表示,即在固定位置上表示小数点。对于乘除法,还需要考虑指数的调整。 ### 效率优化 为了提高大数运算的效率,可以使用以下策略: 1. 基于位的运算:...
遍历两个大数的每一位,从低位到高位逐位相加。如果某一位的和超过9,我们需要进位。这个过程与我们手工做加法时的做法完全一致。为了防止溢出,我们需要记录进位并将其添加到下一位的和中。如果其中一个大数比另一...
在本题中,我们要实现的功能是从键盘接收两个任意大小的整数,然后计算并输出它们的和。这个任务涉及到的主要知识点包括大整数表示、输入输出处理、以及大整数的加法算法。 首先,我们需要理解如何在计算机中表示大...
1. **大数乘法**:在计算机科学中,当两个大数相乘时,不能直接使用内置的乘法操作符。常见的算法有Karatsuba算法、Toom–Cook算法和快速傅里叶变换(FFT)。大数乘法通常通过将每个数字分解为更小的部分,然后对这些...
首先判断两个数字的符号是否相同,如果相同,则将两数的绝对值相加;如果不同,则计算较大绝对值与较小绝对值之差,并赋予正确符号。 4. **减法方法**:`sub`方法用于大整数的减法,逻辑类似于加法,但关注于两数...
1. **加法 (a + b)**:这是最基本的数学运算,在大数计算中,由于数字可能超过常规整型或浮点型数据类型的范围,因此需要特殊的算法来处理两个大数的相加。通常,我们会用到进位加法的概念,确保每一位正确地进行...
例如,两个大数相加需要逐位进行,处理进位问题。优化算法可以显著提高大数运算的效率。 3. **内存占用**:大数的表示通常需要更多内存,尤其是在处理非常大的数时。因此,处理大数时需要考虑内存管理,避免因数据...
例如,两个最大的`int`值相加会得到一个负数,这是由于溢出造成的。因此,要实现一个能处理百亿级别计算的计算器,我们需要自定义一个类,比如`BigInteger`,它能存储和操作大整数。 `BigInteger`类通常会有以下...
3. 乘法:使用`*`运算符进行乘法计算,注意处理溢出问题,尤其是当两个大数相乘时。 4. 除法:除法运算需要注意除数不能为零的情况,否则会抛出`ArithmeticException`。因此,需要在执行除法操作前进行条件检查。 ...
6. **short类型的加法**:在Java中,将`short`与整型常量相加可能导致数据溢出,需要强制转换。例如,`s1 = (short)(s1 + 1);`。对于`s1 += 1;`,编译器会自动处理类型提升,所以不会报错。 7. **char类型的中文...
11. **"=="与equals方法**:"=="比较的是两个变量的引用,而equals方法(默认来自Object类)比较的是对象的内容。重写equals方法可以实现自定义对象的深度比较。 12. **静态变量与实例变量**:静态变量属于类,由类...
7. **char存储中文字符**:char变量可以存储单个Unicode字符,包括中文汉字,因为一个中文汉字通常占两个字节。 8. **2乘以8的计算**:最有效率的方法是直接使用`2 ,这是左移运算符,相当于乘以2的3次方。 9. **...