`
yeshaoting
  • 浏览: 684725 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

【非递归求解】大整数加法

阅读更多

  

问题描述:

整数大到超过所有的基本数据所能表示的数据范围时的加法运算.

 

算法思路:

将大整数分割成可以用基本类型表现的几段,然后采用分治的思想,由低段到高段的顺序,将各段相加.

低位的进位参入紧挨的下一段求和.

 

/**
 * 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.*;
/*
 * TODO 大整数加法
 */
public class BigIntAdd
{
	private static final String x = "12345678901234567";		// 加数x
	private static final String y = "12345678901234567890625";	// 加数y
	//12345691246913469125192
	private static final int wlen = weightExp();				// 权值长度
	private static final long weight = (long)Math.pow(10,wlen);	// 权值
	
	
	/* @TODO for debugging. */
	public static void main(String[] args)
	{
		add(x,y);	// 大整数x,y相加
	}

	/* @TODO 求权值指数,int型最大数长度-1 */
	private static int weightExp()
	{
		/* 可表示的段长 */
		int length = (""+Long.MAX_VALUE).length() - 1;
		return length;
	}

	/* TODO 大整数分割成可表示的几段 */
	private static List<Long> numberDivide(String value)
	{
		/* 用以存储分割后的各段 */
		List<Long> list = new ArrayList<Long>();

		/* 计算分割段数 */
		int size = value.length()/wlen;
		/* 若不能整除,说明还有数据,得在size基础上加1 */
		if(value.length()%wlen != 0)
		{
			size = size + 1;
		}

		int beginIndex;	// 记录读取数据的位置

		/* 以wlen长度为单位,从低位向高位读取数据 */
		for(int i=0; i<size; i++)
		{
			beginIndex = value.length()-wlen*(i+1);
			/* 开始的位置若小于0,则从0开始读 */
			if(beginIndex<0)
				beginIndex = 0;
			String str = value.substring(beginIndex,value.length()-wlen*i);
			
			list.add(Long.parseLong(str));	// 分割的数据存入list
		}

		//display(list);		// 输出各段值
		return list;
	}

	/* TODO 输出显示分割后的大整数各段 */
	private static void display(List<Long> list)
	{
		/* 高段到低段顺序 */
		for(int i=list.size()-1; i>=0; i--)
		{
			System.out.println("value" + i + "=" + list.get(i));
		}
		System.out.println("------------------");
	}

	/* TODO 大整数各段相加 */
	private static void add(String x,String y)
	{
		/* 大整数x,y分割后的存储容器 */
		List<Long> listX = numberDivide(x);
		List<Long> listY = numberDivide(y);
		
		/* 
			二加数分割后的段数不一定相等
			段数多的为准
		 */
		int size = listX.size()>listY.size()?listX.size():listY.size();

		long tempNum = 0;	// 用于计算进位
		long sum = 0;		// 保存各段加法结果
		String result = "";	// 大整数加法结果

		/* 先计算低段,后高段 */
		for(int i=0; i<size; i++)
		{
			long a = 0,b = 0;	// 段值
			if(listX.size()-1>=i)
			{
				a = listX.get(i);
			}

			if(listY.size()-1>=i)
			{
				b = listY.get(i);
			}

			/* 除了加上当前段值外,还要加上上一段进位 */
			sum = tempNum + a + b;
			tempNum = sum/weight; // 当前段进位

			/* result在加号后面,之前算出的result是低段 */
			result = sum%weight + result;	
			//System.out.println(a + "\t" + b + "\t" + tempNum + "\t" + weight);
		}

		/* 最后还得判断一次最高段是否有进位 */
		if(tempNum != 0)
		{
			result = tempNum + result;
		}

		System.out.println("result:" + result);
	}
}

  

 

 

 

  • 大小: 8.1 KB
分享到:
评论

相关推荐

    matlab开发-整数多项式

    本文将详细探讨如何利用MATLAB进行整数多项式的处理,特别是通过"主多项式系数的消去"来求解两个多项式的最大公因数(GCD)。 首先,我们要理解什么是整数多项式。整数多项式是由整数系数构成的一类代数表达式,如\...

    俄式乘法_俄式乘法_

    对于俄式乘法,非递归实现通常会使用两个嵌套循环,分别遍历两个数的每一位,进行逐位相乘和累加的过程。非递归算法在空间效率上优于递归,因为它不需要额外的系统栈空间,但在代码实现上可能较为复杂。 在分析时间...

    《妙趣横生的算法(C语言实现)》(杨峰 编著)

    7.13 递归函数的非递归求解 7.14 任意长度整数加法 第8章 数值计算问题 8.1 递推化梯形法求解定积分 8.2 求解低阶定积分 8.3 迭代法开平方运算 8.4 牛顿法解方程 8.5 欧拉方法求解微分方程 8.6 改进的欧拉方法求解...

    浙江大学ACM模板

    - 在非二分图中求解最大匹配问题的方法。 - 如何利用特定算法求解一般图的最大匹配。 **8.6 一般图匹配(邻接阵)** - 使用邻接矩阵存储方式的一般图匹配问题求解方法。 **8.7 一般图匹配(正向表)** - 正向表...

    基于Java的实例源码-近百种算法大全打包.zip

    - 大整数运算:如大整数加法、减法、乘法和除法。 - 回文判断:检测字符串或数字是否从前往后和从后往前读都一样。 - 最大公约数(GCD)和最小公倍数(LCM)计算。 7. 字符串算法: - KMP算法:高效地在字符串...

    200个经典C程序源码小游戏

    119 超长正整数的加法 第四部分 图形篇 120 绘制直线 121 绘制圆 122 绘制圆弧 123 绘制椭圆 124 设置背景色和前景色 125 设置线条类型 126 设置填充类型和填充颜色 127 图形文本的输出 ...

    c语言实例解析-数值趣味数学篇

    第三部分 数值计算与趣味数学篇 075 绘制余弦曲线和直线的迭加 076 计算高次方数的尾数 077 打鱼还是晒网 078 怎样存钱以获取最大利息 079 阿姆斯特朗数 080 亲密数 ...119 超长正整数的加法

    C语言学习实例220例

    119 超长正整数的加法 第四部分 图形篇 120 绘制直线 121 绘制圆 122 绘制圆弧 123 绘制椭圆 124 设置背景色和前景色 125 设置线条类型 126 设置填充类型和填充颜色 127 图形文本的输出 128 金刚石图案 129 飘带图案...

    C语言程序源代码(大集合).rar

    119 超长正整数的加法 第四部分 图形篇 120 绘制直线 121 绘制圆 122 绘制圆弧 123 绘制椭圆 124 设置背景色和前景色 125 设置线条类型 126 设置填充类型和填充颜色 127 图形文本的输出 128 金刚石图案 129...

    组合数学 组合数 整数划分 递推 方程 多项式定理

    - **域论基础**:域是最简单的代数结构之一,其中包含了加法、乘法运算,而且每个非零元素都有乘法逆元。 以上是对大连理工大学应用数学系组合数学讲义的部分内容进行了概括和总结。这些知识点不仅构成了组合数学的...

    200个经典C程序【源码】

    119 超长正整数的加法 第四部分 图形篇 120 绘制直线 121 绘制圆 122 绘制圆弧 123 绘制椭圆 124 设置背景色和前景色 125 设置线条类型 126 设置填充类型和填充颜色 127 图形文本的输出 128 金刚石图案 ...

    (完整)《C语言程序设计课程设计》题目-软件工程2班.docx

    * 栈类型:需要实现一个以链表作为存储结构的栈类型,然后编写一个求解迷宫的非递归程序。 * 递归算法:需要编写递归形式的算法,求得迷宫中所有可能的通路,并输出迷宫及其通路。 * 迷宫求解:需要使用“穷举求解”...

    数据结构实验.rar

    3、(选做题)采用递归和非递归方法求解汉诺塔问题,问题描述如下: 有三根柱子A、B、C,在柱子A上从下向上有n个从大到小的圆盘,在柱子B和C上没有圆盘,现需将柱子A上的所有圆盘移到柱子C上,可以借助柱子B,要求...

    220个经典C程序源码文件,可以做为你的学习设计参考.zip

    119 超长正整数的加法 第四部分 图形篇 120 绘制直线 121 绘制圆 122 绘制圆弧 123 绘制椭圆 124 设置背景色和前景色 125 设置线条类型 126 设置填充类型和填充颜色 127 图形文本的输出 128 金刚石图案 ...

    初学者练题开始------在POJ上(注:是百练)

    - **大整数加法、乘法、除法**(7.1 至 7.3 例题):学习大整数运算,掌握模拟法或Karatsuba算法等高效方法。 8. **递归与分治**: - **八皇后问题**(9.8 例题):经典的回溯法或位运算解法,理解递归和冲突排除...

    上海交大ACM-ICPC模板

    它的基本思想是选择一个基准元素,然后将数组分成两部分:一部分包含所有比基准小的元素,另一部分包含所有比基准大的元素,之后对这两部分递归地进行同样的操作。 **1.12 归并排序** 归并排序也是一种基于比较的...

    2012级计科专业《算法与数据结构》课程设计题 (2).pdf

    1. 首先实现一个以链表作存储结构的栈类型,然后编写一个求解迷宫的非递归程序。 2. 求得的通路以三元组(i,j,d)的形式输出,其中:(i,j)指示迷宫中的一个坐标,d 表示走到下一坐标的方向。 知识点: * 迷宫求解 * ...

    200个经典C程序源码(包括基础篇+数据结构篇+数值计算与趣味数学篇+图形篇+系统篇+常见试题解答篇).zip

    119 超长正整数的加法 第四部分 图形篇 120 绘制直线 121 绘制圆 122 绘制圆弧 123 绘制椭圆 124 设置背景色和前景色 125 设置线条类型 126 设置填充类型和填充颜色 127 图形文本的输出 128 金刚石图案 ...

    220个C语言程序源代码.zip

    119 超长正整数的加法 第四部分 图形篇 120 绘制直线 121 绘制圆 122 绘制圆弧 123 绘制椭圆 124 设置背景色和前景色 125 设置线条类型 126 设置填充类型和填充颜色 127 图形文本的输出 128 金刚石图案 ...

    人教版七年级数学上册竞赛试卷精选.doc

    15. 代数式的值:利用平方和绝对值的非负性,求解代数式的值。 16. 有理数的比较与极值:在给定的有理数中找出最大值和最小值。 17. 同类项和方程:如果两个同类项的和为零,可以求解mn的值。 18. 多项式的合并:...

Global site tag (gtag.js) - Google Analytics