`
shuidexiongdi
  • 浏览: 73497 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

大数乘法

 
阅读更多
背景:当遇到大数相乘是,用编程语言里面的数字类型做乘法会出现溢出情况,无法满足要求,故需要用字符串方式进行做乘法运算。
此文记录该算法的一个实现。先记录下来,已被后用或后面回顾。

算法原理:还记得我们小学学的算法吗,就是小学算法原理,利用位相乘,进位累加到前一位的原理。
1、将两个大数分解成n个(一个大数*1个一位数字)
2、将另一个大数分解成n个(1位数)
3、分解完后乘法按位相加。

package com.shuidexiongdi.multi;

public class BigMulti {
	
	private static final int ascall = 48;
	
	/**
	 * 字符串乘法
	 * @param mul1
	 * @param mul2
	 * @return
	 */
	public static String doMul(String mul1, String mul2) {
		char[][] arrayTemp = new char[mul2.length()][mul1.length()+mul2.length()];
		initArrayZero(arrayTemp);
		for(int i = mul2.length(),j = 0; i > 0; i--,j++) {
			copyArray(arrayTemp[i-1],doMulti(mul1,mul2.charAt(i-1)),j);
		}
		char [] reaultTemp = doAdd(arrayTemp); 
		//如果第一位是0,则去掉0
		return reaultTemp[0] == '0' ? String.valueOf(reaultTemp,1,reaultTemp.length-1) :String.valueOf(reaultTemp);
//		return String.valueOf(doAdd(arrayTemp));
	}
	
	/**
	 * 乘法
	 * @param str1 字符串乘数
	 * @param multi2 一个字符的被乘数
	 * @return 乘法结果,用char数组返回
	 */
	private static char[] doMulti(String str1, char multi2) {
		int temp;
		int temp1;//个位
		int temp2;//十位
		char[][] arrayTemp = new char[str1.length()][str1.length()+1];
		initArrayZero(arrayTemp);
		for (int i = str1.length(), j = str1.length()+1; i > 0; i--, j--) {
			temp = (str1.charAt(i-1) - ascall) * (multi2 - ascall) ;
			temp1 = temp / 10; //
			temp2 = Math.abs(temp % 10);
			arrayTemp[i-1][j-2] = String.valueOf(temp1).charAt(0);
			arrayTemp[i-1][j-1] = String.valueOf(temp2).charAt(0);
		}
		
		return doAdd(arrayTemp);
	}
	
	/**
	 * 初始化0数组
	 * @param array
	 */
	private static void initArrayZero(char[][] array) {
		for(char[] aaa : array) {
			for(int i = 0; i < aaa.length; i++) {
				aaa[i] = '0';
			}
		}
	}
	
	
	/**
	 * 拷贝数组中字符至正确位
	 * @param targetArray
	 * @param array
	 * @param index 数组偏移量
	 */
	private static void copyArray(char[] targetArray, char[] array,int index) {
		for(int i = array.length,j = targetArray.length; i > 0; i--,j--) {
			targetArray[j-1-index] = array[i-1];
		}
	}
	
	/**
	 * 将数组中字符按位做加法运算
	 * @param array
	 * @return
	 */
	private static char[] doAdd(char[][] array) {
		char[] add = new char[array[0].length];
		for(int i = 0; i < add.length; i++ ) {
			add[i] = '0';
		}
		
		int next = 0;//进位
		for(int i = add.length; i > 0; i--) {
			int addTemp = 0;//相加中间数
			for(char[] aaa : array) {
				addTemp += (aaa[i-1] - ascall);
			}
			addTemp += next;
			int temp2 = Math.abs(addTemp % 10);
			add[i-1] = String.valueOf(temp2).charAt(0);
			next = addTemp / 10;
		}
		return add;
	}
	
	public static void main(String[] args) {
		System.out.println(doMul("3345454654654654654654656456565","4534543543534534534543543543543543543"));
	}
	
}
分享到:
评论
1 楼 hdwmp123 2012-02-14  

相关推荐

    C语言-大数乘法

    在IT领域,大数乘法是一项基础且重要的计算任务,特别是在加密、数字信号处理和算法设计等场景。本文将深入探讨“C语言-大数乘法”,特别是针对16进制大数乘法以及如何使用unsigned char数组来表示和处理任意长度的...

    大数乘法VC++实现

    本项目通过VC++6.0环境实现了大数乘法的算法,这在课程设计和实验教学中是一个典型的问题。这里我们将深入探讨大数乘法的原理、实现方式以及在C++中的应用。 首先,我们要理解什么是大数。在常规的整数类型如int或...

    论文研究-大数乘法的GPU加速实现.pdf

    大数乘法是公钥加密中最为核心的计算环节之一,快速实现大数乘法单元也是RSA、ElGamal、全同态等密码体制急需解决的问题之一。目前,基于C 的NTL GMP库函数虽然能在CPU上实现高精度的大数乘法,但其仍不能满足加密对...

    大数乘法 用字符串实现大数乘法

    大数乘法 用字符串实现大数乘法,大整数乘法,用string类实现

    大数乘法C语音实现

    在计算机科学中,大数乘法是处理超过标准整型数据范围的数字乘法操作。在C语言中,由于int、long等基本类型有其数值范围限制,处理大数时通常需要自定义数据结构和算法。这篇内容将深入探讨如何在C语言环境下,使用...

    大数乘法能够实现2个200位以内数的乘法

    5. **库支持**:许多编程语言如Python、Java、C#等都内置了大数支持,提供了简便的大数乘法函数,例如Python的`*`运算符可以直接用于大数乘法,底层通常会用到上述的高效算法。 在描述中提到的“将该数拆分,进行...

    可以c运行的大数乘法

    在IT领域,大数乘法是一项基础且重要的计算任务,特别是在加密算法、数学软件和分布式计算等场景中。本文将详细解析如何使用C语言高效地实现大数乘法。 大数乘法通常涉及到超出普通整型变量范围的数值运算。在C语言...

    C#编写的大数乘法运算原代码

    在编程领域,大数乘法运算是一项基础但重要的任务,特别是在需要处理超出普通整型或浮点型数据范围的情况。C#作为一种现代化的面向对象的编程语言,提供了丰富的数据类型和算法支持来处理这种问题。本篇文章将深入...

    大数乘法程序代码

    在处理金融计算、加密算法、数学建模等领域时,经常需要进行大数运算,其中包括大数乘法。本节将详细探讨大数乘法的算法以及相关编程实现。 在传统的计算机中,整数通常由固定长度的位(如32位或64位)表示,这限制...

    基于字符串的大数乘法

    基于字符串的大数乘法 有效解决大数乘法溢出的问题

    大数模板(C++)大数加法、大数乘法、大数除法

    用C++写的重载的大数模板 大数加法、大数乘法、大数除法、大数减法 带有注释

    Q714586 C语言大数乘法的运算

    Q714586 C语言大数乘法的运算 https://ask.csdn.net/questions/714586

    acm大数乘法

    ### ACM大数乘法知识点详解 #### 一、引言 在计算机科学中,处理大数运算是一项重要的技能,尤其是在算法竞赛(ACM)中。传统整型数据类型(如`int`, `long long`等)无法直接支持非常大的数字进行计算。例如,当...

    任意两个大数乘法,理论上可算2G长度的两个数的乘法,C++

    任意两个大数乘法,理论上可算2G长度的两个数的乘法,C++实现,在VS 2008下编译通过

    大数乘法-基于c语言实现

    算法设计,利用c语言实现大数乘法,如需更多帮助,请发邮件至1436125018#qq。com(发送时请把地址中的‘#’换成‘@’)

    数据结构中的大数乘法

    "数据结构中的大数乘法"这个主题就是关于如何高效地进行大数乘法操作的探讨。 大数乘法在密码学、分布式计算、财务计算、科学计算等领域都有广泛应用。例如,RSA加密算法就依赖于大数的乘法和因数分解。传统的整数...

    大数乘法的GPU加速实现.pdf

    【大数乘法的GPU加速实现】 大数乘法在密码学中扮演着至关重要的角色,尤其是在公钥加密算法如RSA、ElGamal以及全同态加密等体制中。这些算法通常涉及到大整数的复杂运算,而大数乘法是其中计算量最大的部分之一。...

    动态数组实现大数乘法

    用java写的动态数组实现的大数乘法.两个大数相乘:利用数组实现,数组a存放大数1的每一位,数组b依次存放大数2的每一位。如:一大数1为3463546,则数组 a[]={3,4,6,3,5,4,6},大数2为:89019 则数组b[]={8,9,0,1,9},...

    大数乘法 vc++ 可执行程序代码

    标题中的“大数乘法”指的是在计算机科学中处理超出普通整型范围的大整数的乘法运算。这种运算在密码学、计算数学、分布式计算等领域广泛应用,例如在RSA加密算法中就需要大数的乘法操作。VC++是微软开发的C++编译器...

    C++ 大数乘法 一般算法

    ### C++大数乘法一般算法详解 #### 算法背景与应用场景 在计算机科学领域,特别是编程竞赛、加密算法、金融计算等场景中,经常需要处理超过标准整型或浮点型变量所能表示的大数。对于这些场景,传统的乘法运算不再...

Global site tag (gtag.js) - Google Analytics