在计算机中,长整型(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 点分析知,存放乘积的字符数组
的长度应不小于存放乘数与被乘数的两个数组的长度之和。
#include "StdAfx.h" #include "subStr.h" #include<iostream> using namespace std; #define MAX_LENTH 201 void mul(int lenA,int lenB,int *bigNumA,int *bigNumB,int *resultNum){ int i,j,index,mid; for(i=0;i<lenA;i++){ index=i; for(j=0;j<lenB;j++){ resultNum[index++]+=bigNumA[i]*bigNumB[j]; } } //以下为处理和值进位 for(i=0;i<=index;i++){ if(resultNum[i]>=10){ mid=resultNum[i]/10; resultNum[i+1]+=mid; resultNum[i]%=10; } } //以下为输出 if(resultNum[index]!=0){ printf("%d",resultNum[index]); } for(i=index-1;i>=0;i--){ printf("%d",resultNum[i]); } printf("\n"); } int main(){ char numA[MAX_LENTH],numB[MAX_LENTH]; int bigNumA[MAX_LENTH],bigNumB[MAX_LENTH],resultNum[MAX_LENTH*2]; int i,pos,len; while(scanf("%s %s",numA,numB)!=EOF){ //注意两点,memset第三个参数是字节数,不能用strlen(bigNumA)。例如: //memset(bigNumA,0,strlen(bigNumA))是错误的。 //bigNumA[MAX_LENTH]={0}这种将数组元素统一置为0的方式只有在声明的时候才能使用。 //以下的“//”解开后是会出错的。 memset(bigNumA,0,sizeof(bigNumA)); memset(bigNumB,0,sizeof(bigNumB)); memset(resultNum,0,sizeof(resultNum)); //bigNumA[MAX_LENTH]={0}; //bigNumB[MAX_LENTH]={0}; //以下是将接收到的大整数numA和numB存储到bigNumA和bigNumB中,个位对应bigNumx[0],以此类推。 pos=0; for(i=strlen(numA)-1;i>=0;i--){ bigNumA[pos++]=numA[i]-'0'; } pos=0; for(i=strlen(numB)-1;i>=0;i--){ bigNumB[pos++]=numB[i]-'0'; } if(strlen(numA)>strlen(numB)) { len=strlen(numA); }else{ len=strlen(numB); } mul(strlen(numA),strlen(numB),bigNumA,bigNumB,resultNum); } system("pause"); return 0; }
相关推荐
大整数乘法 c++ 代码 大整数乘法 c++ 代码 大整数乘法 c++ 代码 大整数乘法 c++ 代码 大整数乘法 c++ 代码 大整数乘法 c++ 代码 大整数乘法 c++ 代码 大整数乘法 c++ 代码
### 大整数乘法算法选择和分析 #### 引言 大整数乘法在密码学、生物信息学、基因工程等领域具有重要的应用价值。然而,这些数值往往超出了传统编程语言能够直接处理的范围,因此需要特殊的数据结构和算法来支持其...
本项目"大整数乘法的C语言实现"提供了一个简洁的解决方案,能够处理200位的大整数乘法,尽管代码量不大,却充分展示了C语言处理复杂计算的能力。 首先,我们来看大整数乘法的基本原理。传统的小数乘法可以扩展到...
快速傅立叶变换(FFT)是一种高效的计算离散傅立叶变换(DFT)的算法,对于处理大整数乘法具有重要的应用价值。在计算机科学尤其是数学和信号处理领域,FFT是解决复杂数学问题的关键工具。本文将深入探讨FFT在大整数...
### 二进制大整数乘法的知识点详解 #### 1. 分治法与大整数乘法 - **分治法基本思想**:分治法是一种将问题分解成若干个规模较小的子问题来解决的方法。这些子问题相互独立且与原问题相同,最后将子问题的解合并...
大整数乘法是计算机科学中的一个重要问题,特别是在处理金融计算、加密算法或者数学运算时。传统的乘法算法,如竖式乘法,对于小整数是有效的,但当涉及非常大的数字时,效率就变得极低。为了解决这个问题,计算机...
本文将深入探讨一种用于大整数乘法的算法,该算法以数组为数据结构来存储和处理计算过程,具有较高的效率。 标题中的"相当不错的大整数乘法算法"指的是一种能有效处理超出常规整型范围的大整数乘法方法。在描述中...
Python中的大整数乘法是处理超过普通整型范围的大数乘法的一种方法。在Python中,整数类型(int)可以自动处理任意大小的数值,包括大整数。但当我们需要高效地处理大整数乘法时,尤其是对位数较多的数进行运算,就...
大整数乘法实现(未用分治与递归) 大整数乘法是计算机科学中的一种基本运算,它在密码学、数据加密、科学计算等领域中有着广泛的应用。在本文中,我们将实现大整数乘法的算法,着重于探讨未使用分治与递归的实现...
在本案例中,我们探讨的是如何运用分治法来处理大整数乘法问题。大整数乘法在密码学、计算几何、计算生物学等领域都有广泛应用,特别是在涉及到大量数据计算时,传统的算术运算可能无法胜任,因此需要高效的方法。 ...
在计算机科学领域,处理大整数乘法是一个重要的计算任务,特别是在加密算法、数学软件以及分布式计算中。本文将深入探讨“大整数乘法问题”及其解决方案——分而治之算法,结合“LargeIntegerMulti_algorithm”这个...
下面我们将深入探讨C语言实现大整数乘法的相关知识点。 首先,C语言标准库并不直接支持大整数的操作,它提供的`int`、`long`等类型有其存储和运算限制。为了处理大整数,我们需要自定义数据结构。通常,我们会选择...
### 大整数乘法的数据结构及算法 大整数乘法在密码学、生物信息学、基因工程等众多领域中扮演着至关重要的角色。在这些领域中,我们需要处理的整数往往远远超出传统整数类型所能表示的范围,因此,如何设计高效且...
大整数乘法c语言源文件大整数乘法c语言源文件大整数乘法c语言源文件大整数乘法c语言源文件大整数乘法c语言源文件大整数乘法c语言源文件大整数乘法c语言源文件大整数乘法c语言源文件大整数乘法c语言源文件大整数乘法...
实验报告的标题“大整数乘法实验报告/vc”表明了本次实验的主题是关于大整数乘法的实现,使用的编程环境为VC(Visual C++)。实验的描述提到使用了分治策略来解决大整数乘法问题,并且提供了完整的可运行代码。 大...
### 大整数乘法的实现 #### 实验背景及目的 随着计算机技术的发展,大整数乘法在密码学、大数据处理等领域有着广泛的应用。然而,在计算机内部,硬件能够直接处理的整数通常受限于一定的位数范围,超出这个范围的...
**分治法大整数乘法** 分治法是一种经典的算法设计策略,它将一个复杂的问题分解成若干个较小的子问题,然后分别解决这些子问题,最后将子问题的解合并得到原问题的解。这种方法特别适用于那些可以通过分解来简化...
### 大整数乘法实现解析 在计算机科学中,处理大整数的乘法是一项基本但复杂的任务,尤其当涉及到超出标准数据类型(如`int`或`long`)所能表示的数值范围时。本篇文章将深入探讨一种基于字符串处理的大整数乘法...