大整数乘法

参考:http://hi.baidu.com/operationsystem/blog/item/6e45dd1af1acadf3ae51330b.html

   在计算机中,长整型(long int)变量的范围是 -2147483648 至 2147483647,因此若用长整型变量做乘法运算,乘积最多不能超过 10位数。即便用双精度型(double)变量,也仅能保证 16 位有效数字的精度。在某些需要更高精度的乘法运算的场合,需要用别的办法来实现乘法运算。
        比较容易想到的是做多位数乘法时列竖式进行计算的方法,只要写出模拟这一过程的程序,就能实现任意大整数的乘法运算。经过查阅资料,找到一种更易于编程的方法,即“列表法”。

下面先介绍“列表法”:
例如当计算8765 x 234时,把乘数与被乘数照如下列出,见表1:                         

 

大整数乘法_第1张图片                        
把表1中的数按图示斜线分组(横纵坐标和相等的数分为一组),把每组数的累加起来所得的和记在表格下方,见表 2:
大整数乘法_第2张图片

        从最低位的 20 开始,保留个位数字“0”,把个位以外的数“2”进到前一位;把次低位的 39 加上低位进上来的 2 得 41,保留个位数字“1”,把“4”进到前一位;以此类推,直至最高位的 16,16 加上低位进上来的4得 20,保留“0”,把2进到最高位,得乘积答数 2051010。                      

大整数乘法_第3张图片
根据以上思路就可以编写C 程序了,再经分析可得:
1、一个m 位的整数与一个 n 位的整数相乘,乘积为m+n-1 位或m+n 位。
2、程序中,用三个字符数组分别存储乘数、被乘数与乘积。由第 1 点分析知,存放乘积的字符数组
的长度应不小于存放乘数与被乘数的两个数组的长度之和。
3、可以把第二步“计算填表”与第三四步“累加进位”放在一起完成,可以节省存储表格 2所需的空间。
4、程序关键部分是两层循环,内层循环累计一组数的和,外层循环处理保留的数字与进位。

 

代码如下

#include <stdio.h> #include <stdlib.h> #include <string.h> #define MAX 1000 int main() { char a[MAX], b[MAX]; int c[MAX*2]; //c存a*b的结果 int aLen , bLen; memset(c, 0, sizeof(c)); scanf("%s %s", a, b); aLen = strlen(a); bLen = strlen(b); for(int i=0; i<aLen; i++) a[i] = a[i] - '0'; for(int i=0; i<bLen; i++) b[i] = b[i] - '0'; int index = -1; for(int i=aLen-1; i>=0; i--) { index = aLen - i - 1; for(int j=bLen-1; j>=0; j--) //c[0]存的是最低位 { c[index] += a[i] * b[j]; c[index+1] += c[index]/10; c[index] = c[index]%10; index++; } } bool isBegin = false; for(int i=MAX*2-1; i>=0; i--) { if(c[i] != 0) { printf("%d", c[i]); isBegin = true; } else if(isBegin) { printf("%d", c[i]); } } if(!isBegin) printf("0"); printf("/n"); system("pause"); return 0; }

 

你可能感兴趣的:(编程,c,System,存储)