问题描述:
整数大到超过所有的基本数据所能表示的数据范围时的加法运算.
算法思路:
递归的将大整数分割成二段,直至分割后的段可以用基本类型表示.
由低段到高段的顺序,合并各段.值得注意的是,这种顺序是不可颠倒的,因为高段需要用到低段的进位.也就是说,低段的进位要参入紧挨的下一段的加和运算.所以,add(mid+1,endIndex);在add(beginIndex,mid);语句前.
实现程序:
/**
* Copyright (c) 2011 Trusted Software and Mobile Computing(TSMC)
* All right reserved.
*
* Created on 2011
*
* http://jarg.iteye.com/
*
*/
// Contributors: Jarg Yee <yeshaoting@gmail.com>
import java.util.*;
/*
* 大整数加法
* @author jarg
* @version 1.0
*/
public class BigIntAdd
{
/** 加数 */
private static String x = "123456789012345678901234567890123456789012";
/** 加数 */
private static String y = "123456789012345678901234567890625";
/** 边界,段最大长度 */
private static final int wLen = String.valueOf(Long.MAX_VALUE).length()-1;
/** 大整数加法结果 */
private static String result = "";
/**
补齐二加数.
使得二加数长度一致,省去了很多不繁琐的边界检测.
*/
private static void init()
{
int maxLength = getMaxLength(x,y); // 二加数最大长度
int minLength = getMinLength(x,y); // 二加数最小长度
/* 补齐二加数 */
for(int i=0;i<maxLength-minLength;i++)
{
if(x.length()==minLength)
x = "0" + x;
else
y = "0" + y;
}
}
/** for debugging. */
public static void main(String[] args)
{
init(); /* 补齐加数,使二加数等长 */
add(0,getMaxLength(x,y)-1);
System.out.println("result:" + result);
}
/** 大整数加法 */
private static int add(int beginIndex,int endIndex)
{
long value = 0; // 加和值
int carry = 0; // 进位
long weight = (long)Math.pow(10,endIndex-beginIndex+1); // 权值
if(endIndex-beginIndex+1<=wLen)
{
/* 单段加法 */
value = Long.parseLong(x.substring(beginIndex,endIndex+1)) + Long.parseLong(y.substring(beginIndex,endIndex+1));
}
else
{
int mid = (beginIndex + endIndex)/2; // 中间,从中间将大整数分割成二段
/* 二个add的函数,有先后顺序,得先求出进位,然后加到高位上 */
/* 进位 */
carry = add(mid+1,endIndex);
/* 合并结果,将结果与权值的余数保存到结果中 */
value = carry + add(beginIndex,mid);
}
if(value%weight!=0)
result = (value%weight) + result;
System.out.println("begin:" + beginIndex + "\tend:" + endIndex + "\tvalue:" + value + "\t进位:" + (int)(value/weight));
/* 返回进位 */
return (int)(value/weight);
}
/** 计算二字符串最大字符长度 */
private static int getMaxLength(String strX,String strY)
{
return strX.length()>strY.length()?strX.length():strY.length();
}
/** 计算二字符串最小字符长度 */
private static int getMinLength(String strX,String strY)
{
return strX.length()<=strY.length()?strX.length():strY.length();
}
}
![](http://dl.iteye.com/upload/attachment/450551/2041b936-b667-34a2-8b56-67faa45023bc.jpg)
分享到:
相关推荐
在给出的代码片段中,可以看到作者通过一系列辅助函数和核心递归函数实现了大整数的乘法。这种方法有效地解决了大整数乘法问题,同时也展示了分治法的强大之处。 #### 六、总结 通过分治法实现大整数的乘法是一种...
【分治法大数相乘】是解决大整数乘法问题的一种高效算法,它将一个大问题分解为若干个小问题来求解。在大整数相乘的问题中,两个整数A和B分别有n位和m位,常规方法是逐位相乘并累加,但这种方法的时间复杂度过高。...
Karatsuba算法是一种分治策略,将两个大整数拆分为较小的部分,通过递归计算降低计算复杂度。Toom-Cook算法则是基于多项式插值的方法,进一步优化了乘法运算。 4. 除法:大整数的除法通常比加减乘复杂得多,因为它...
大整数的实现通常会涉及递归、动态规划等高级编程技巧,这为初学者提供了实践和提升编程技能的机会。 通过深入理解和实践这个C++大整数运算程序,学习者不仅能掌握大整数运算的原理,还能了解如何将理论知识应用于...
该示例程序实现了两个整数相乘的功能,但没有直接使用乘法操作符`*`,而是通过反复调用自身函数实现加法。 ```c int Multiply(int M, int N) { int Result; if (N == 1) { Result = M; // 递归结束条件 } else ...
在描述中提到的加法函数,可能是一个递归实现整数加法的例子。例如,一个递归加法函数可能如下所示: ```cpp int add(int a, int b) { if (b == 0) { // 基本情况,当第二个数为0时结束递归 return a; } else { ...
表达式求解部分能处理包含整数和浮点数的四则表达式,而大整数运算部分则要求用户输入不超过200位的大整数进行运算。 在概要设计阶段,我们考虑了两种关键的数据结构:LinkStack(链接栈)和LinkCharStack(链接...
3. 性能优化:思考如何减少因递归深度过大导致的性能问题,例如通过使用循环或者预处理步骤来消除不必要的递归。 4. 扩展性:探讨如何将此解析器扩展到支持更多运算符、括号或其他数学概念,如乘除、指数等。 总的...
2. **递归求解**:递归地解决这些子问题。 3. **合并结果**:将各个子问题的解合并以得到原问题的解。 #### 典型实例1:大整数乘积 ##### 小学手算法 - **实现**:按照传统的手动乘法算法执行计算。 - **效率分析...
素数问题,整数趣题,数学问题求解,矩阵,回文素数,求100~200之间的素数,阿姆斯特朗数,特殊的完全平方数,求1000以内的完全数,三重回文数,亲密数,自守数,神奇的数字6174,一数三平方,二分法求解方程,牛顿...
7.13 递归函数的非递归求解 7.14 任意长度整数加法 第8章 数值计算问题 8.1 递推化梯形法求解定积分 8.2 求解低阶定积分 8.3 迭代法开平方运算 8.4 牛顿法解方程 8.5 欧拉方法求解微分方程 8.6 改进的欧拉方法求解...
8. **斐波那契数列的递归求解**:9.8部分的数列是一个特殊的斐波那契数列,根据奇偶性交替增加或减少前两项。递归函数根据n的奇偶性选择加法或减法规则来计算第n项。 9. **偶数分解**:9.9部分的程序设计任务是分解...
2. **递归求解方法:** 采用递归方法,从第一个人开始逐级向上求解,直到得到第五个人的年龄。 3. **代码实现:** - 直接求解: ```java public class Demo23 { public static void main(String[] args) { int ...
本文将详细探讨如何利用MATLAB进行整数多项式的处理,特别是通过"主多项式系数的消去"来求解两个多项式的最大公因数(GCD)。 首先,我们要理解什么是整数多项式。整数多项式是由整数系数构成的一类代数表达式,如\...
但默认的整型数据类型(如int、long long)的范围可能不足以处理非常大的数值,特别是在处理长整数时。为了解决这个问题,我们需要自定义数据结构和算法来实现长整数的存储和运算。 在"用C++实现长整数的输入输出...
总的来说,分治法在处理大整数乘法这样的问题时,通过将问题分解为更小的子问题,然后递归地解决,最后合并子问题的解,能够显著提高计算效率。在实际应用中,还需要考虑到算法的实现细节,如数据结构的选择和优化,...
Stein算法,由J.Stein在1961年提出,它的特点是避免了除法和取模操作,只使用整数的移位、加法和减法。这种方法在处理大整数时特别有效,因为它避免了对模运算的昂贵计算。Stein算法的核心在于利用了一些关于最大公...
- 矩阵的基本操作,如加法、乘法等。 - 如何利用矩阵进行图像变换等操作。 **14.4 线性方程组** - 线性方程组的定义及其求解方法。 - 如何利用高斯消元法等方法求解线性方程组。 **14.5 线性相关** - 线性相关的...
对于大整数的其他运算,如加法、减法,可以通过类似模拟人类计算的方式来实现。大整数相除通常更为复杂,可以考虑因式分解或模拟除法过程,结合大整数乘法、减法和比较。 2. 找出唯一不同的数 给定一个包含2n+1个数...
由于标准的`int`、`long`或`long long`类型可能不足以存储超过一定范围的大整数,因此需要自定义数据结构或使用库来实现长整数运算。在“C++长整数计算器”的项目中,我们将探讨如何在Microsoft Visual Studio 2019...