大整数乘法--C++
- 格式:doc
- 大小:76.50 KB
- 文档页数:7
整数的乘法运算法则整数的乘法运算是数学中非常基础和重要的运算之一,它有一些独特的规则和性质。
在这篇文章中,我们将深入探讨整数的乘法运算法则,包括乘法的交换律、结合律、分配律等内容。
首先,我们来回顾一下整数的乘法定义。
对于任意的整数a和b,它们的乘积记作a*b,表示a和b相乘得到的结果。
例如,2*3=6,-4*5=-20。
在整数的乘法运算中,有一些特殊的规则需要我们特别注意。
首先是乘法的交换律。
乘法的交换律指的是,对于任意的整数a和b,a*b=b*a。
换句话说,整数的乘法满足交换律,乘数的顺序不影响乘积的结果。
这一性质可以通过具体的例子来验证,比如2*3=6,3*2=6,-4*5=-20,5*(-4)=-20。
接下来是乘法的结合律。
乘法的结合律指的是,对于任意的整数a、b和c,(a*b)*c=a*(b*c)。
换句话说,整数的乘法满足结合律,乘法的结合顺序不影响乘积的结果。
这一性质也可以通过具体的例子来验证,比如(2*3)*4=24,2*(3*4)=24,(-4*5)*2=-40,-4*(5*2)=-40。
最后是乘法的分配律。
乘法的分配律指的是,对于任意的整数a、b和c,a*(b+c)=a*b+a*c。
换句话说,整数的乘法满足分配律,乘法对加法的分配性质成立。
这一性质同样可以通过具体的例子来验证,比如2*(3+4)=14,2*3+2*4=14,-4*(5+6)=-44,-4*5+(-4*6)=-44。
通过以上的讨论,我们可以得出结论:整数的乘法运算满足交换律、结合律和分配律。
这些性质是整数乘法运算的基本规则,也是我们在进行乘法运算时必须遵守的规则。
在实际的数学运算中,这些性质可以帮助我们简化计算,准确求得乘积的结果。
总之,整数的乘法运算法则是数学中的重要内容,它包括乘法的交换律、结合律、分配律等多个方面。
这些规则和性质在我们的日常数学运算中起着至关重要的作用,帮助我们准确进行乘法运算,得到正确的结果。
整数的乘法与除法运算整数的乘法与除法是数学中常见且基础的运算方法。
在我们日常生活和学习中,乘法和除法是经常使用的运算符号。
本文将详细介绍整数的乘法和除法运算,包括其定义、性质、运算法则,并且通过一些实际例子来帮助读者更好地理解和掌握这两种运算。
一、整数的乘法运算整数的乘法运算是将两个整数相乘得到一个新的整数的过程。
乘法符号用“×”表示,如a×b表示a与b的乘积。
整数的乘法运算有以下几个基本性质:1. 乘法的交换律:对于任意整数a和b,a×b=b×a。
2. 乘法的结合律:对于任意整数a、b和c,(a×b)×c=a×(b×c)。
3. 乘法的分配律:对于任意整数a、b和c,a×(b+c)=a×b+a×c。
利用这些性质,我们可以简化复杂的乘法运算,提高计算效率。
下面通过几个具体例子来说明:例 1:计算(-3)×5。
解:根据乘法的结合律和分配律,可以将(-3)×5转化为(-1)×(3×5)。
再根据乘法的交换律和结合律,可以得到(-1)×(3×5)=(-1)×(5×3)=(-1)×15=-15。
例 2:计算(-2)×(-4)。
解:根据乘法的交换律,(-2)×(-4)=(-4)×(-2)。
再根据乘法的结合律,可以得到(-4)×(-2)=(-1)×(4×2)=(-1)×8=-8。
通过以上例子,我们可以看出,整数的乘法运算可以根据运算法则来变换,从而简化计算过程。
二、整数的除法运算整数的除法运算是将一个整数除以另一个整数得到商和余数的过程。
除法符号用“÷”或者“/”表示,如a÷b或者a/b表示a除以b的商。
在整数除法中,应注意以下几个重要概念:1. 整除:如果a÷b的商为整数,即没有余数,我们称a可以被b整除,或者说b能够整除a。
整数的乘法与除法运算整数的乘法是数学中最基本也是最常见的运算之一。
它涉及两个整数的相乘,结果也是一个整数。
整数的除法是指一个整数被另一个整数除后所得到的商,结果也是一个整数。
本文将重点探讨整数的乘法和除法运算,并介绍一些相关的概念和技巧。
一、整数的乘法运算整数的乘法是指两个整数相乘得到一个新的整数的过程。
整数的乘法运算遵循以下几个基本规则:1. 正整数乘法:两个正整数相乘,结果为正整数。
例如,2乘以3等于6。
2. 负整数乘法:两个负整数相乘,结果为正整数。
例如,-2乘以-3等于6。
3. 正负整数乘法:一个正整数和一个负整数相乘,结果为负整数。
例如,2乘以-3等于-6。
在进行整数的乘法运算时,我们可以应用以下一些技巧:1. 乘法交换律:整数的乘法满足交换律,即a乘以b等于b乘以a。
例如,2乘以3等于3乘以2。
2. 乘法结合律:整数的乘法满足结合律,即(a乘以b)乘以c等于a乘以(b乘以c)。
例如,(2乘以3)乘以4等于2乘以(3乘以4)。
二、整数的除法运算整数的除法是指一个整数被另一个整数除后所得到的商。
在整数的除法运算中,有以下几个要点需要注意:1. 整数除以正整数:一个整数除以一个正整数,结果可能是一个整数,也可能是一个带余的分数。
例如,10除以3等于3余1。
2. 整数除以零:整数除以零是没有意义的,因为在数学中除数不能为零。
3. 整数除以负整数:一个整数除以一个负整数,结果可能是一个整数,也可能是一个带余的分数。
例如,10除以-3等于-3余1。
4. 零除以整数:零除以任何整数的结果都是零。
在进行整数的除法运算时,我们可以应用以下一些技巧:1. 除法的定义:整数a除以整数b等于商c和余数d之间的关系可以表示为a=b*c+d。
其中,商c是两个整数相除得到的整数部分,余数d是两个整数相除得到的剩余部分。
2. 除法的逆运算:除法的逆运算是乘法。
即,如果a除以b的商为c和余数为d,那么a等于b乘以c加上d。
大整数乘法问题描述通常,在分析一个算法的计算复杂性时,都将加法和乘法运算当作是基本运算来处理,即将执行一次加法或乘法运算所需的计算时间当作一个仅取决于计算机硬件处理速度的常数。
这个假定仅在计算机硬件能对参加运算的整数直接表示和处理时才是合理的。
然而,在某些情况下,我们要处理很大的整数,它无法在计算机硬件能直接表示的范围内进行处理。
若用浮点数来表示它,则只能近似地表示它的大小,计算结果中的有效数字也受到限制。
若要精确地表示大整数并在计算结果中要求精确地得到所有位数上的数字,就必须用软件的方法来实现大整数的算术运算。
请设计一个有效的算法,可以进行两个n位大整数的乘法运算。
参考解答大整数的乘法问题描述参考解答设X和Y都是n位的二进制整数,现在要计算它们的乘积XY。
我们可以用小学所学的方法来设计一个计算乘积XY的算法,但是这样做计算步骤太多,显得效率较低。
如果将每2个1位数的乘法或加法看作一步运算,那么这种方法要作O(n2)步运算才能求出乘积XY。
下面我们用分治法来设计一个更有效的大整数乘积算法。
图6-3 大整数X和Y的分段我们将n位的二进制整数X和Y各分为2段,每段的长为n/2位(为简单起见,假设n是2的幂),如图6-3所示。
由此,X=A2n/2+B ,Y=C2n/2+D。
这样,X和Y的乘积为:XY=(A2n/2+B)(C2n/2+D)=AC2n+(AD+CB)2n/2+BD (1)如果按式(1)计算XY,则我们必须进行4次n/2位整数的乘法(AC,AD,BC和BD),以及3次不超过n位的整数加法(分别对应于式(1)中的加号),此外还要做2次移位(分别对应于式(1)中乘2n和乘2n/2)。
所有这些加法和移位共用O(n)步运算。
设T(n)是2个n位整数相乘所需的运算总数,则由式(1),我们有:(2)由此可得T(n)=O(n2)。
因此,用(1)式来计算X和Y的乘积并不比小学生的方法更有效。
要想改进算法的计算复杂性,必须减少乘法次数。
大整数乘法和strassen矩阵乘法大整数乘法和Strassen矩阵乘法是计算机科学中两个非常重要的算法。
在我们的日常生活中,我们经常需要比较大的数字,例如,考虑到我们的身份证号码或者信用卡号码中的位数就很大。
对于这些大数字的计算,实现乘法运算的标准方法导致了效率低下。
这就要依靠大整数乘法的算法来完成。
同样的,矩阵乘法是人们常用的数据分析和机器学习等领域的基础算法之一,Strassen矩阵乘法则是一种可以在更短时间内完成的矩阵乘法算法。
在接下来的文档中,我将详细讲解大整数乘法和Strassen矩阵乘法。
一、大整数乘法大整数乘法是指对于两个比较大的数字,我们如何快速且准确的计算它们的乘积。
在介绍大整数乘法的算法之前,先考虑乘法的基本方法。
在日常乘法中,乘法运算是通过对乘数和被乘数的每一位进行相乘并将结果相加而得到的。
例如,计算96 ×57,我们将乘数96 和被乘数57 的每一位相乘,去得到:``` 96 × 57 ------- 672 (6 x 7) 480 (9 x 5) <<1> +57600 (9 x 5 << 2> ) ------- 5472 ```我们在这个过程中需要进行至Less 2次的延时计算,6次的加法,这在数字比较小时的时候是可行的。
但是,如果数字的位数变得更大,传统的乘法算法就会非常不切实际,执行效率非常慢。
在大整数乘法中,我们需要考虑实现优化的算法以处理大量位数的数字,其中最流行和普遍使用的算法有以下两种:1.传统的分治算法2.卡拉茨巴乘法1.传统的分治算法传统的分治算法涉及将大的数字分解为更小的数字部分进行乘法运算,并且在计算此过程之间能够快速地进行组合。
该算法需要依靠递归算法的思想,在整个运算过程中采用分治策略。
如果给定两个长度为n的数字,我们可以将这些数字分成两个较小,长度为 n/2 的数字,然后将它们相乘。
在递归调用中,相同的方法会被重复递归调用。
C语言中超大整数乘法运算在计算机中,长整型(long int)变量的范围是 -2147483648 至 2147483647,因此若用长整型变量做乘法运算,乘积最多不能超过 10位数。
即便用双精度型(double)变量,也仅能保证 16 位有效数字的精度。
在某些需要更高精度的乘法运算的场合,需要用别的办法来实现乘法运算。
比较容易想到的是做多位数乘法时列竖式进行计算的方法,只要写出模拟这一过程的程序,就能实现任意大整数的乘法运算。
经过查阅资料,找到一种更易于编程的方法,即“列表法”。
下面先介绍“列表法”:例如当计算8765 x 234时,把乘数与被乘数照如下列出,见表1:把表1中的数按图示斜线分组(横纵坐标和相等的数分为一组),把每组数的累加起来所得的和记在表格下方,见表 2:从最低位的 20 开始,保留个位数字“0”,把个位以外的数“2”进到前一位;把次低位的 39 加上低位进上来的 2 得 41,保留个位数字“1”,把“4”进到前一位;以此类推,直至最高位的 16,16 加上低位进上来的4得 20,保留“0”,把2进到最高位,得乘积答数 2051010。
根据以上思路就可以编写C 程序了,再经分析可得:1、一个m 位的整数与一个 n 位的整数相乘,乘积为m+n-1 位或m+n 位。
2、程序中,用三个字符数组分别存储乘数、被乘数与乘积。
由第 1 点分析知,存放乘积的字符数组的长度应不小于存放乘数与被乘数的两个数组的长度之和。
3、可以把第二步“计算填表”与第三四步“累加进位”放在一起完成,可以节省存储表格 2所需的空间。
4、程序关键部分是两层循环,内层循环累计一组数的和,外层循环处理保留的数字与进位。
编写的程序如下:#define MAXLENGTH 1000#include <stdio.h>#include <string.h>void compute(char *a, char *b, char *c);void main(void){char a[MAXLENGTH], b[MAXLENGTH], c[MAXLENGTH * 2];puts("Input multiplier :");gets(a);puts("Input multiplicand :");gets(b);compute(a, b, c);puts("Answer :");puts(c);getchar();}void compute(char *a, char *b, char *c){int i, j, m, n;long sum, carry;m = strlen(a) - 1;n = strlen(b) - 1;for (i = m; i >= 0; i--)a[i] -= '0';for (i = n; i >= 0; i--)b[i] -= '0';c[m + n + 2] = '\0';carry = 0;for (i = m + n; i >= 0; i--) /* i 为坐标和 */{sum = carry;if ((j = i - m) < 0)j = 0;for ( ; j<=i && j<=n; j++) /* j 为纵坐标 */ sum += a[i-j] * b[j]; /* 累计一组数的和 */c[i + 1] = sum % 10 + '0'; /* 算出保留的数字 */ carry = sum / 10; /* 算出进位 */}if ((c[0] = carry+'0') == '0') /* if no carry, */ c[0] = '\040'; /* c[0] equals to space */}效率分析:用以上算法计算 m位整数乘以n 位整数,需要先进行 m x n次乘法运算,再进行约m + n次加法运算和 m + n次取模运算(实为整数除法)。
整数的乘法与除法整数是数学中的一种基本数值概念,它包括正整数、负整数和零。
在数学运算中,整数的乘法与除法具有独特的特点和规则。
本文将详细探讨整数的乘法与除法,并解释其运算规则和注意事项。
一、整数的乘法整数的乘法是指将两个整数相乘得到的结果。
在进行整数乘法时,按照以下规则进行运算:1. 两个正整数相乘,结果仍为正整数。
例如,2乘以3等于6。
2. 两个负整数相乘,结果也为正整数。
例如,-2乘以-3等于6。
3. 一个正整数与一个负整数相乘,结果为负整数。
例如,2乘以-3等于-6。
需要注意的是,整数乘法满足交换律和结合律。
即,对于任意整数a、b和c:- 交换律:a乘以b等于b乘以a。
- 结合律:(a乘以b)乘以c等于a乘以(b乘以c)。
二、整数的除法整数的除法是指将一个整数分割为若干份,每份相等,找到份数的过程。
在进行整数除法时,按照以下规则进行运算:1. 两个正整数相除,结果可能是正整数、小数或分数。
例如,6除以3等于2,6除以4等于1.5。
2. 两个负整数相除,结果也可能是正整数、小数或分数。
例如,-6除以-3等于2,-6除以-4等于1.5。
3. 一个正整数除以一个负整数,结果可能是正整数、小数或分数。
例如,6除以-3等于-2,6除以-4等于-1.5。
需要注意的是,整数除法存在取整的特点。
即,如果两个整数相除得到的结果为小数或分数,则可以取整为最接近原结果的整数。
常见的取整方式有:- 向上取整:结果取比原结果大的最小整数。
- 向下取整:结果取比原结果小的最大整数。
- 四舍五入:结果取最接近原结果的整数。
此外,整数除法也满足商的唯一性。
即,对于任意整数a和b,除非a除以b得到的商相等,否则它们的余数一定不相等。
结论整数的乘法与除法是数学中重要的基本运算。
对于整数乘法,要根据正负整数的不同情况进行运算,并注意满足交换律和结合律。
对于整数除法,要考虑结果可能是正整数、小数或分数的情况,同时要注意取整的方法和商的唯一性。
C语言中超大整数乘法运算在计算机中,长整型(long int)变量的范围是 -48 至 47,因此若用长整型变量做乘法运算,乘积最多不能超过 10位数。
即便用双精度型(double)变量,也仅能保证 16 位有效数字的精度。
在某些需要更高精度的乘法运算的场合,需要用别的办法来实现乘法运算。
比较容易想到的是做多位数乘法时列竖式进行计算的方法,只要写出模拟这一过程的程序,就能实现任意大整数的乘法运算。
经过查阅资料,找到一种更易于编程的方法,即“列表法”。
下面先介绍“列表法”:例如当计算8765 x 234时,把乘数与被乘数照如下列出,见表1:把表1中的数按图示斜线分组(横纵坐标和相等的数分为一组),把每组数的累加起来所得的和记在表格下方,见表 2:从最低位的 20 开始,保留个位数字“0”,把个位以外的数“2”进到前一位;把次低位的 39 加上低位进上来的 2 得 41,保留个位数字“1”,把“4”进到前一位;以此类推,直至最高位的 16,16 加上低位进上来的4得 20,保留“0”,把2进到最高位,得乘积答数 2051010。
根据以上思路就可以编写C 程序了,再经分析可得:1、一个m 位的整数与一个 n 位的整数相乘,乘积为m+n-1 位或m+n 位。
2、程序中,用三个字符数组分别存储乘数、被乘数与乘积。
由第 1 点分析知,存放乘积的字符数组的长度应不小于存放乘数与被乘数的两个数组的长度之和。
3、可以把第二步“计算填表”与第三四步“累加进位”放在一起完成,可以节省存储表格 2所需的空间。
4、程序关键部分是两层循环,内层循环累计一组数的和,外层循环处理保留的数字与进位。
编写的程序如下:#define MAXLENGTH 1000#include <>#include <>void compute(char *a, char *b, char *c);void main(void){char a[MAXLENGTH], b[MAXLENGTH], c[MAXLENGTH * 2];puts("Input multiplier :");gets(a);puts("Input multiplicand :");gets(b);compute(a, b, c);puts("Answer :");puts(c);getchar();}void compute(char *a, char *b, char *c) {int i, j, m, n;long sum, carry;m = strlen(a) - 1;n = strlen(b) - 1;for (i = m; i >= 0; i--)a[i] -= '0';for (i = n; i >= 0; i--)b[i] -= '0';c[m + n + 2] = '\0';carry = 0;for (i = m + n; i >= 0; i--) /* i 为坐标和 */ {sum = carry;if ((j = i - m) < 0)j = 0;for ( ; j<=i && j<=n; j++) /* j 为纵坐标 */sum += a[i-j] * b[j]; /* 累计一组数的和 */c[i + 1] = sum % 10 + '0'; /* 算出保留的数字 */carry = sum / 10; /* 算出进位 */}if ((c[0] = carry+'0') == '0') /* if no carry, */c[0] = '\040'; /* c[0] equals to space */}效率分析:用以上算法计算 m位整数乘以n 位整数,需要先进行 m x n次乘法运算,再进行约m + n次加法运算和 m + n次取模运算(实为整数除法)。
整数的乘法了解整数的相乘运算整数的乘法是数学中常见且重要的运算,它涉及到整数的相乘和乘法规则。
了解整数的乘法可以帮助我们更好地理解和应用数学知识。
本文将介绍整数的乘法概念、乘法规则以及一些实际应用。
一、整数的乘法概念整数是由负整数、零和正整数组成的数集,可以表示为...(这里可以给出整数的定义)。
整数的乘法即是整数之间的相乘运算,用符号“×”表示。
例如,2 × 3,表示将整数2和整数3相乘。
在整数的乘法中,有几个非常重要的概念需要了解。
首先是乘法的交换律,即 a × b = b × a,无论整数a和b的顺序如何,乘积是相等的。
其次是乘法的结合律,即 (a × b) × c = a × (b × c),无论整数a、b和c的顺序如何,乘积是相等的。
二、整数的乘法规则整数的乘法有一些特定的规则,需要注意和掌握。
以下是整数乘法的常见规则:1. 正数乘以正数,结果为正数。
例如,2 × 3 = 6,表示将正整数2乘以正整数3得到正整数6。
2. 负数乘以负数,结果为正数。
例如,(-2) × (-3) = 6,表示将负整数-2乘以负整数-3得到正整数6。
3. 正数乘以负数,结果为负数。
例如,2 × (-3) = -6,表示将正整数2乘以负整数-3得到负整数-6。
4. 零乘以任何整数,结果都为零。
例如,0 × 7 = 0,无论乘以任何整数,结果都为0。
以上规则可以通过实际计算和数学证明来理解和验证。
掌握整数乘法的规则可以帮助我们更准确地进行计算和解决问题。
三、整数乘法的实际应用整数乘法在我们的日常生活中有很多实际应用。
例如:1. 商业计算:在商业交易中,我们需要计算商品的价格与数量之间的乘积,从而得到总价。
整数乘法在这种情况下是非常常见的应用。
2. 图形计算:在几何学中,我们常常需要计算图形的面积和体积,这需要通过对边长、高度等整数进行乘法运算来得到准确的结果。
俞正强数与运算主题中的整数乘法运算【引言】在数学的数与运算主题中,整数乘法运算是一项基础且重要的内容。
它不仅贯穿于我们的日常学习和生活,而且对于后续学习高级数学知识也有着关键性的作用。
本文将对整数乘法运算进行详细的解析,以帮助读者更好地理解和掌握这一基本运算。
【整数乘法运算的定义和基本规则】整数乘法运算是指两个整数相乘得到一个新的整数。
在数学中,我们用符号“×”表示乘法运算。
例如,5×3=15,表示5和3的乘积为15。
整数乘法运算的基本规则有以下几点:1.任意两个整数都可以进行乘法运算。
2.乘法运算的结果称为乘积,是一个新的整数。
3.乘法运算满足交换律、结合律和分配律。
【整数乘法运算的算理和算法】整数乘法运算的算理主要包括两个方面:乘法口诀和竖式计算。
1.乘法口诀:乘法口诀是我们从小就开始学习的一种知识,它可以帮助我们快速地进行乘法运算。
例如,6×7=42,我们可以通过记忆“六七四十二”来得到答案。
2.竖式计算:竖式计算是一种常用的乘法运算方法,适用于较大整数的乘法。
例如,计算24×13,我们可以按照以下步骤进行:24 × 13------72 (4×3)48 (4×1+2×3)------312【整数乘法运算的误区分析和规避方法】在整数乘法运算过程中,一些常见的误区可能导致计算错误。
为了避免这些问题,我们可以采取以下方法:1.注意乘法运算的优先级,避免先进行加减法运算。
2.熟练掌握乘法口诀,提高计算速度和准确性。
3.在进行竖式计算时,注意对齐数字,避免混淆。
4.遇到复杂乘法问题时,可以先进行分解,再逐步计算。
【整数乘法运算在实际生活中的应用】整数乘法运算在实际生活中有着广泛的应用,如购物、计算面积和体积等。
例如,购买水果时,我们可以通过计算总价和单价来确定购买数量。
在建筑领域,通过计算房间的长、宽和高,可以得到房间的体积,从而确定所需建材的数量。
大整数乘法仅供参考#include<iostream>#include<string>using namespace std;void MUL_max(string a,int la,string b,int lb,int **c);//相乘函数void ADD_max(int * d,int **c,int la,int lb);//相加函数char * ZhuanH(string);void main(){string a;string b;int **c=NULL;int *d=NULL;int la=0,lb=0;int i=0,j=0,k=0;cout<<" ************大整数乘法**************"<<endl;cout<<"请输入乘数:";cin>>a;cout<<"请输入被乘数:";cin>>b;la=a.length();lb=b.length();//分配2维C数组,存储数组a和b的乘积c=new int*[la];for(k=0;k<la;k++)c[k]=new int[lb+1];//分配数组d用于存储最终结果d=new int[la+lb+1];for(i=0;i<la+lb+1;i++)//初始化,便于后面判断相加后的有效位数d[i]=0;//初始化数组C,便于后面判断相加后的有效位数for(i=0;i<la;i++)for(j=0;j<=lb;j++)c[i][j]=0;//调用函数MUL_max(a,la,b,lb,c);ADD_max(d,c,la,lb);k=0;cout<<a<<"和"<<b<<"相乘结果是:"<<endl;for(i=0;i<=la+lb;i++){if(d[i]==0)k++;elsebreak;}for(i=k;i<=la+lb;i++)cout<<d[i];cout<<endl;for(int n=0;n<lb;n++){delete c[n];}delete[la] c;delete [] d;}void MUL_max(string a,int la,string b,int lb,int **c) {int mid=0,i=0,j=0;int k=0;int num_a=0,num_b=0;char *char_a=NULL,*char_b=NULL;char_a=ZhuanH(a);//将String转化为插入*char_b=ZhuanH(b);//开始循环相乘la*lb次for(i=la-1;i>=0;i--)for(j=lb-1;j>=0;j--){num_a=a[i]-48;num_b=b[j]-48;if((k=num_a*num_b)>=10)//判断乘积是否有进位{if(mid!=0)//判断前一次相乘是否有进位c[i][j+1]=k%10+mid;elsec[i][j+1]=k%10;mid=k/10;}else//没有进位{if(mid!=0)//判断前一次相乘是否有进位c[i][j+1]=k+mid;elsec[i][j+1]=k;mid=0;}}if(mid!=0)c[i][0]=k/10;//如果乘数个位和被乘数相乘,最后有进位}//数组相加函数void ADD_max(int *d,int **c,int la,int lb){int i=0,j=0;int mid=0;int num_a=0,num_b=0;int add=0,midnum=0;//将相乘得到的二维数组C各行错位相加,得到一位数组dfor(i=la-1;i>=0;i--)for(j=lb;j>=0;j--){num_a=d[i+j+1];num_b=c[i][j];add=num_a+num_b;if(add>=10)//判断相加是否有进位{if(midnum==1)d[i+j+1]=add%10+1;elsed[i+j+1]=add%10;midnum=1;}else{d[i+j+1]=add;midnum=0;}}if(midnum==1)d[0]=add/10;}//转化函数char * ZhuanH(string src){char *dst=new char[255];int i;for(i=0;i<=src.length();i++)dst[i]=src[i];dst[i]='\0';return dst;}#include <stdio.h>#include <assert.h>#include <stdlib.h>#include <conio.h>//To calculate two 40 bits integers multiply,change 10 to 40#define THE_ARR_A_SIZE 10 #define ARR_B_SIZETHE_ARR_A_SIZE#define ARR_C_SIZE (THE_ARR_A_SIZE + ARR_B_SIZE)030 void main(void);031 void Multiply( short *, short *, short *, short, short);032 void Carrying( short *c, short);033034 void main(void)035 {036 short A[THE_ARR_A_SIZE] = {9, 9, 9, 9, 9, 9, 9, 9, 9, 9}; // 10 037 short B[ARR_B_SIZE] = {9, 9, 9, 9, 9, 9, 9, 9, 9, 9};038 short C[ARR_C_SIZE];039 short i = 0;040041 for ( NULL; i < ARR_C_SIZE; i++)042 {043 *(C+i) = 0;044 }045046 Multiply(A, B, C, THE_ARR_A_SIZE, ARR_B_SIZE);047 Carrying(C, ARR_C_SIZE);048049 printf("\nThe Result is: ");050051 i = 0;052 if (C[0] == 0) ++i; //To delete the primacy zero 053 for ( NULL; i < ARR_C_SIZE; i++)054 {055 printf("%d", C[i]);056 }057 getch();058 printf("\n");059 }060061 /*062 * NOTICE:063 * The Array C is not initialed,you should do that. Here 064 * the array is supposed to be filled zero.065 * Algorithm:066 *067 */068069 void Multiply( short A[], short B[], short C[], short A_size, shor t B_size)070 {071 short i = 0, j = 0, k = 1; // Assigned k to 1 to leave C[0]072 //be null to storage the carrying.073074 for (j = 0; j<B_size; j++)075 {076 for (i = 0; i<A_size; i++)077 {078 C[k] += B[j] * A[i];079 k++;080 }081 k = 2;082 k = k + j;083 }084 }085086 // To solve the carrying .087088 void Carrying(short C[],short C_size)089 {090 short i, tens_place = 0, units_order = 0; 091 short temp = 0, end_arr;092093 end_arr = C_size-1;094 for (i = end_arr; i >= 0; i--)095 {096 temp = C[i];097 if (C[i] > 9)098 {099 tens_place = temp / 10;100 units_order = temp % 10;101 C[i-1] += tens_place;102 C[i] = units_order;103 }104 }105 }。