`
MicahChen
  • 浏览: 1784 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

“大整数相加”的递归解法

阅读更多
最近毕业在即,经常流连于各大公司的笔试面试之间,不断的面试,不断的杯具……
最后发现好多题目都是似曾相识,这里就介绍一条经典的题目——编程实现两个大整数的相加
函数接口如下:
String addBigInt(StringBuffer num1, StringBuffer num2);

思路分析:
1、如果用递归的思想来看,其实就是第i位的数字相加,剩余的i-1位组成的大数,继续进行递归流程
2、目标相加的字符串需要先倒序,保证位对齐,而结果再倒序,则可以得到正确的答案

代码如下:
/**
 * @author Micah
 * 
 */
public class Calculator {

	/**
	 * use the recursion to add the big integer.
	 * 
	 * @param num1
	 * @param num2
	 * @param isCarry
	 * @param result
	 */
	public static void addBigInt(StringBuffer num1, StringBuffer num2, int pos,
			boolean isCarry, StringBuffer result) {
		if (pos < num1.length() || pos < num2.length()) {
			int value = 0;
			if (isCarry) {
				value++;
			}
			char temp1 = pos < num1.length() ? num1.charAt(pos) : '0';
			char temp2 = pos < num2.length() ? num2.charAt(pos) : '0';
			value += add(temp1, temp2);
			if (value >= 10) {
				isCarry = true;
				value -= 10;
			} else {
				isCarry = false;
			}
			result.append(value);
			addBigInt(num1, num2, ++pos, isCarry, result);
		} else {
			if (isCarry) {
				result.append('1');
				addBigInt(num1, num2, ++pos, false, result);
			}
		}

	}

	/**
	 * add method for big number.
	 * 
	 * @param num1
	 * @param num2
	 */
	public static String addBigInt(StringBuffer num1, StringBuffer num2) {
		StringBuffer result = new StringBuffer();

		num1.reverse();
		num2.reverse();

		addBigInt(num1, num2, 0, false, result);

		result.reverse();

		return result.toString();
	}

	// TODO: need to decrease the conversion between different types, maybe a
	// array to priorly store all the data.
	private static int add(char num1, char num2) {
		return Integer.parseInt(String.valueOf(num1))
				+ Integer.parseInt(String.valueOf(num2));
	}
}


哈,第一次在JavaEye上面发东西,大家多多指教啦~~
1
0
分享到:
评论

相关推荐

    世界500强面试题.pdf

    1.4.1. 递归和非递归俩种方法实现二叉树的前序遍历.................................... 73 1.4.2. 请修改 append 函数,利用这个函数实现............................................. 78 1.4.3. 有 n 个长为 m+...

    一个组合数问题(递归完成)

    然而,递归解法虽然直观,但效率较低,因为它包含了大量重复计算。为了提高效率,我们可以采用动态规划的方法,将已经计算过的组合数存储起来,避免重复计算。这被称为备忘录法(memoization): ```python def ...

    C#递归题目实例代码

    在编程领域,递归是一种强大的工具,特别是在解决复杂问题时。C#中,递归是通过函数自身调用来实现的。本例中的“C#递归题目实例代码...同时,也可以借此机会探讨不同算法的选择和优化,比如对比递归和迭代解法的优劣。

    c++-c++编程基础之leetcode题解第13题罗马数字转整数.zip

    1. 如果较小的数字在较大的数字左侧,两者相加,例如 IV(4)和 IX(9)。 2. 如果较小的数字在较大的数字右侧,两者相减,例如 VI(6)和 XIV(14)。 为了实现这个转换,我们可以采取以下步骤: 1. 创建一个整型...

    java面试-leetcode面试java编程题解之第2题两数相加-java题解.zip

    这是一个典型的链表操作和计算问题,它考察了Java程序员对链表结构、迭代或递归方法以及基本算术运算的理解。以下是一个可能的Java解题思路: 首先,我们需要定义链表节点类`ListNode`,它包含一个整数值和指向下一...

    LeetCode-[removed]Javascript 刷 Leetcode 的解法

    JavaScript个人 Javascript 刷 Leetcode 的解法有问题的话欢迎发 issue ヾ(•ω•`)o标签:,,,,,,,,,,,,,,#题目解法难度标签0001JavaScript简单数组,哈希表0002两数相加JavaScript中等递归,...

    c代码-2. 两数相加 [中等] https://leetcode-cn.com/problems/add-two-numbers

    递归解法从最高位开始,逐位相加并处理进位,直到遇到零结束。 9. **错误处理**:在实际编程中,需要考虑边界情况,如输入的链表为空、只有一个节点、或节点值超出预期范围等。 在 `main.c` 文件中,你将找到实现...

    C++中你必须知道的23种算法

    河内之塔是一个经典的递归问题,它展示了如何通过有限步骤将一个圆盘堆从一根柱子移动到另一根柱子,同时遵守大盘子在小盘子下方的原则。该问题通常用于教学递归算法的概念。解法是使用三个柱子,A、B和C,其中A是...

    c#-Leetcode面试题解之第2题两数相加.zip

    给定两个非空链表表示两个非负整数。数字顺序是正向的,即最高位位于链表的第一个节点,最低位位于最后一个节点。每个节点包含一个数字,它们的范围是 0 到 9。现在,你需要将这两个数相加,并以相同格式返回一个新...

    java算法题(30个)

    - 知识点:逆向思维,递归或迭代解法。 - 从最后一天的桃子数量逆推至第一天。 15. **乒乓球队比赛**: - 知识点:逻辑推理,排除法。 - 根据已知条件,通过排除法确定比赛名单。 16. **菱形图案**: - 知识...

    《C语言程序设计课程设计》题目.pdf

    - **栈操作**:非递归解法利用栈进行路径探索,回溯寻找通路。 - **递归算法**:找出所有可能的通路,递归遍历迷宫。 - **输出**:以方阵形式展示迷宫及通路。 - **穷举求解**:按照特定规则穷举所有可能的路径...

    非常好的Java练习题

    8. **兔子问题**:斐波那契数列的应用,递归或动态规划解法。 9. **水仙花数**:遍历三位数,检查每位数的立方和是否等于原数。 10. **数字字符串相加**:字符串处理,通过循环和累加计算多位数的和。 11. **完数...

    LeetCode前400题Java精美版

    2. **Add Two Numbers** (Medium): 题目要求将两个链表表示的非负整数相加。解决方法通常是将两个链表从低位到高位逐位相加,并处理进位,最后形成新的链表。 3. **Longest Substring Without Repeating Characters...

    ACM_online_judge例题讲解

    为了解决这个问题,可以调整循环的顺序,从大到小累加,即从i=j开始递减到1,这样可以减少精度损失,使得程序能够正确地通过ACM在线判题系统的验证。 题目1023 "A+B+C+D+... 的挑战"涉及到处理多行输入的问题。在...

    leetcode官方50题算法详解

    leetcode官方50题算法详解这一资源包含了LeetCode上经典的50道编程题目,覆盖了算法面试中常见问题的解法和思路。这些题目按照不同数据结构...掌握这些题目的解法和思路,对提高编程能力和解决实际问题具有极大的帮助。

    java方法练习题及答案.doc.docx

    递归解法简洁但效率低,循环解法则更高效。斐波那契数列的第n项可以通过前两项相加得到,即F(n) = F(n-1) + F(n-2),初始值为F(0) = 0,F(1) = 1。 2. **素数判断**:素数是大于1且除了1和自身外没有其他正因数的...

    C#面试题目

    递归解法简洁,但效率低,因为存在大量重复计算。 4. **委托与事件**: - **委托**:C#中的委托类似于函数指针,可以将方法作为参数传递,也可以用来实现事件。 - **事件**:是委托的一种特殊形式,用于实现发布/...

    java-leetcode面试题解Stack之第42题接雨水-题解.zip

    "接雨水"问题描述如下:给定一个高度不一的非空整数数组,这些数组值代表坐标轴上的柱子高度,当天空下雨时,雨水会储存在柱子之间,问能储存多少雨水。雨水只能储存在相邻柱子之间的下凹部分。 对于这个题解,首先...

    ACM编程大赛培训-经典资料

    - 排列组合问题的递归解法等。 5. 模式串匹配问题(模式串匹配问题总结) 模式串匹配问题主要关注字符串处理中的一些高效算法,知识点包括: - 字符串HASH方法。 - KMP匹配算法,时间复杂度为O(M+N)。 - KARP-...

Global site tag (gtag.js) - Google Analytics