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

超大数相加,相乘

    博客分类:
  • J2SE
 
阅读更多
超出long上限的大数相加,相乘算法。
public class StringCompute {

	private static final class instanceClass {
		public static final StringCompute instance = new StringCompute();
	}

	private static StringCompute getInstance() {
		return instanceClass.instance;
	}

	private StringCompute() {
	}

	/**
	 * [方法功能说明]
	 * 
	 * @param args
	 */
	public static void main(String[] args) {
				
		long start = System.currentTimeMillis();
		
		StringCompute.getInstance().multiply("4545687745456468777878787878787", "46465464646465445456656465");
		
		System.out.println((System.currentTimeMillis() - start)+"[ms]");
		
		start = System.currentTimeMillis();
			
		System.out.println(StringCompute.getInstance().add("4545687745456468777878787878787", "46465464646465445456656465"));
			
		System.out.println((System.currentTimeMillis() - start)+"[ms]");
	}


	/**
	 * 
	 * [超大数相加]
	 * 
	 * @param a
	 * @param b
	 * @return
	 */
	private String add(String a, String b) {
		StringBuilder c = new StringBuilder("");
		char[] aArray = a.toCharArray();
		char[] bArray = b.toCharArray();
		int upper = 0; // 进位
		int length = aArray.length < bArray.length ? aArray.length
				: bArray.length;
		char[] maxArray = aArray.length > bArray.length ? aArray : bArray;
		int i = 0;
		for (; i < length; i++) {
			int temp = Integer.parseInt("" + (aArray[aArray.length - i - 1]))
					+ Integer.parseInt("" + bArray[bArray.length - i - 1])
					+ upper;

			upper = temp / 10;
			c.append(temp % 10);

		}
		if (aArray.length != bArray.length) {
			// c.append(maxArray[maxArray.length - i -1]+upper);
			for (int j = (maxArray.length - i - 1); j >= 0; j--) {
				int temp = Integer.parseInt("" + (maxArray[j])) + upper;
				upper = temp / 10;
				c.append(temp % 10);
			}
		}
		if (upper != 0) {
			c.append(upper);
		}
		return c.reverse().toString();
	}

	private void multiply(String p1, String p2) {
																					// ;
		int ASCII = 48;
		char[] result = new char[p1.length() + p2.length()];
		for (int i = 0; i < result.length; i++) {
			result[i] = '0';
		}
		char ctemp = ' ';
		//逆序
		char[] pc1 = p1.toCharArray();
		for (int i = 0; i < pc1.length / 2; i++) {
			ctemp = pc1[i];
			pc1[i] = pc1[pc1.length - 1 - i];
			pc1[pc1.length - 1 - i] = ctemp;
		}
		//逆序
		char[] pc2 = p2.toCharArray();
		for (int i = 0; i < pc2.length / 2; i++) {
			ctemp = pc2[i];
			pc2[i] = pc2[pc2.length - 1 - i];
			pc2[pc2.length - 1 - i] = ctemp;
		}
		int temp = 0;// 临时结果
		int step = 0;// 进位
		int time = 0;// 次数
		int bit = 0;// 位数
		for (char c1 : pc1) {
			time = bit;
			for (char c2 : pc2) {
				temp = (c1 - ASCII) * (c2 - ASCII);
				temp = temp + result[time] - ASCII;
				if (temp > 9) {// 进位
					int i = 0;
					do {
						result[time + i] = (char) (temp % 10 + ASCII);
						step = (temp - temp % 10) / 10;
						i++;
						temp = result[time + i] - ASCII + step;
					} while (temp > 9);
					result[time + i] = (char) (temp + ASCII);
				} else {
					result[time] = (char) (temp + ASCII);
				}
				time++;
			}
			bit++;
		}
		System.out.println("##############################");
//		System.out.print(p1 + " x " + p2 + " = ");
		for (int i = result.length - 1; i >= 0; i--) {
			System.out.print(result[i]);
		}
		System.out.println();
		System.out.println("##############################");
	}

}
分享到:
评论

相关推荐

    任意位数整数相加相乘

    自己用C++写的一个整数相加相乘的控制台程序,用字符串来实现任意位数的整数之间的相加和相乘,通过string和int的相互转化达到我们正常计算时候的过程,不受整型规定字节数的影响,刚兴趣的朋友可以参考,有什么问题...

    多项式相加和相乘c语言源代码

    多项式相加和相乘C语言源代码 本篇文章将对C语言中多项式相加和相乘的源代码进行详细的解释和分析。 一、多项式相加 多项式相加是指将两个多项式相加,生成一个新的多项式。在C语言中,我们可以使用链表来实现...

    数据结构实验一完成多项式的相加相乘运算.doc

    "数据结构实验一完成多项式的相加相乘运算" 数据结构实验一完成多项式的相加相乘运算是数据结构课程中的一个实验项目。该实验的目的是为了让学生掌握线性表的基本操作,例如插入、删除、查找等,并学习如何使用...

    多项式相加相乘polynam

    C++实现多项式相加相乘 在VC6.0环境下调试成功

    多项式相加相减相乘操作

    C++实现多项式相加相减相乘操作,用链实现

    数据结构实验一完成多项式的相加相乘运算

    【实验项目】:数据结构实验一 - 多项式的相加相乘运算 【实验目的与要求】: 1. 掌握线性表的基本操作,包括插入、删除和查找等,以便实现多项式数据结构。 2. 学习如何利用线性表的接口解决实际问题,如多项式的...

    相加相乘.cpp

    相加相乘.cpp

    稀疏矩阵相加相乘(三元组、十字链表)

    以上就是关于“稀疏矩阵相加相乘(三元组、十字链表)”的主要知识点,涵盖了稀疏矩阵的基本概念、存储方法以及相加和相乘的具体实现。在编程实践中,理解这些内容有助于优化算法,提高程序性能。

    数据结构课程设计稀疏矩阵相加与相乘

    在提供的`稀疏矩阵相加与相乘.cpp`文件中,很可能是实现了上述的稀疏矩阵相加和相乘的算法。通过阅读和理解代码,可以深入学习如何在C++中高效地处理稀疏矩阵操作,包括数据结构的设计、遍历算法的实现以及优化技巧...

    一元多项式相加相乘(可循环)

    用c语言实现的一元多项式的相加相乘,此为可循环版本

    大数运算 大数相加 大数相乘

    本篇文章将详细介绍如何用C/C++实现大数相加和大数相乘。 首先,我们要理解大数的概念。在计算机内部,基本的数据类型如int、long等都有其存储范围限制,对于超出这些范围的整数,就需要用到大数表示。在C/C++中,...

    用链表实现多项式相乘以及相加

    "链表实现多项式相乘以及相加" 链表是一种基本的数据结构,在计算机科学和软件工程中广泛应用。链表的优点是可以动态地分配内存,可以高效地存储和操作大量数据。在多项式的运算中,链表可以用来实现多项式的加法、...

    稀疏矩阵相加和相乘

    稀疏矩阵A和B均以三元组表作为存储结构,输出矩阵相加和相乘的三元组表

    稀疏矩阵相加、相乘和转置(用三元组实现)

    稀疏矩阵相加、相乘和转置(用三元组实现)

    一元多项式相加相减相乘

    一元多项式相加相减相乘 一元多项式相加相减相乘是指对一元多项式进行相加、相减、相乘运算的一种实现方法。该方法采用菜单驱动方式进行执行,需要构造数据结构和算法过程。 数据结构设计: 在该设计中,我们使用...

    多项式相加相乘

    #include&lt;iostream&gt; using namespace std; struct LNode //定义节点类型 { float coef; int expn; LNode * next; };

    用C语言实现复数相加和相乘

    本篇文章将详细讲解如何用C语言实现复数的相加和相乘操作。 复数是由实部和虚部组成的数学概念,通常表示为`a + bi`,其中`a`是实部,`b`是虚部,`i`是虚数单位,满足`i^2 = -1`。在C语言中,我们可以定义一个...

    数据结构实验一完成多项式的相加相乘运算.pdf

    在“数据结构实验一完成多项式的相加相乘运算”中,我们关注的主要知识点集中在数据结构的应用,尤其是线性表的使用,以及如何利用它来处理多项式的数学运算。 首先,实验的目的在于掌握线性表的基本操作,如插入、...

    一元多项式的相加/相减/相乘

    本主题将深入探讨如何使用数组来实现一元多项式的相加、相减和相乘。 首先,我们要理解一元多项式的表示。在数组中,我们可以将多项式的每一项视为数组的一个元素,其中元素的索引对应于项的指数,元素的值对应于...

    多项式相加、相乘

    通过C++平台实现了多项式的相乘、相加的运算,复杂度较小

Global site tag (gtag.js) - Google Analytics