C语言中超大整数乘法运算.pdf
《C语言中超大整数乘法运算.pdf》由会员分享,可在线阅读,更多相关《C语言中超大整数乘法运算.pdf(8页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、.C 语言中超大整数乘法运算 在计算机中,长整型(long int)变量的范围是-2147483648 至 2147483647,因此若用长整型变量做乘法运算,乘积最多不能超过 10 位数。即便用双精度型(double)变量,也仅能保证 16 位有效数字的精度。在某些需要更高精度的乘法运算的场合,需要用别的办法来实现乘法运算。比较容易想到的是做多位数乘法时列竖式进行计算的方法,只要写出模拟这一过程的程序,就能实现任意大整数的乘法运算。经过查阅资料,找到一种更易于编程的方法,即“列表法”。下面先介绍“列表法”:例如当计算 8765 x 234 时,把乘数与被乘数照如下列出,见表 1:把表 1 中
2、的数按图示斜线分组(横纵坐标和相等的数分为一组),把每组数的累加起来所得的和记在表格下方,见表 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、析知,存放乘积的字符数组 的长度应不小于存放乘数与被乘数的两个数组的长度之和。3、可以把第二步“计算填表”与第三四步“累加进位”放在一起完成,可以节省存储表格 2 所需的空间。4、程序关键部分是两层循环,内层循环累计一组数的和,外层循环处理保留的数字与进位。编写的程序如下:#define MAXLENGTH 1000#include#include void compute(char*a,char*b,char*c);void main(void)char aMAXLENGTH,bMAXLENGTH,cMAXLENGTH*2;puts(Input multiplier:);gets(a);pu
4、ts(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-)ai-=0;for(i=n;i=0;i-)bi-=0;cm+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
5、为纵坐标*/sum+=ai-j*bj;/*累计一组数的和*/ci+1=sum%10+0;/*算出保留的数字*/carry=sum/10;/*算出进位*/if(c0=carry+0)=0)/*if no carry,*/c0=040;/*c0 equals to space*/.效率分析:用以上算法计算 m 位整数乘以 n 位整数,需要先进行 m x n 次乘法运算,再进行约 m+n 次加法运算和 m+n 次取模运算(实为整数除法)。把这个程序稍加修改,让它自己产生乘数与被乘数,然后计算随机的 7200 位整数互乘,在 Cyrix 6x86 pr166 机器的纯 DOS 方式下耗时 7 秒(用
6、Borland C3.1 编译)。经过改进,此算法效率可以提高约 9 倍。注意到以下事实:8216547 x 96785 将两数从个位起,每 3 位分为节,列出乘法表,将斜线间的数字相加;8 216 547 96 785 将表中最后一行进行如下处理:从个位数开始,每一个方格里只保留三位数字,超出 1000 的部 分进位到前一个方格里;所以 8216547 x 96785=795238501395 也就是说我们在计算生成这个二维表时,不必一位一位地乘,而可以三位三位地乘;在累加时也是满 1000 进位。这样,我们在计算 m 位整数乘以 n 位整数,只需要进行 m x n/9 次乘法运算,再进行约
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言 超大 整数 乘法 运算
限制150内