#include "stdio.h" #include "stdlib.h" #include "string.h" /*---------------------------------------------- 大整数乘法 在计算机中,长整型(long int)变量的范围是 -2147483648 至 2147483647, 因此若用长整型变量做乘法运算,乘积最多不能超过 10位数。即便用双精度型(double)变量, 也仅能保证 16 位有效数字的精度。在某些需要更高精度的乘法运算的场合,需要用别的办法来实现乘法运算。 比较容易想到的是做多位数乘法时列竖式进行计算的方法,只要写出模拟这一过程的程序, 就能实现任意大整数的乘法运算。经过查阅资料,找到一种更易于编程的方法,即“列表法”。 下面先介绍“列表法”: 例如当计算1234 x 456时,把乘数与被乘数照如下列出,见表1: 表1: 1 2 3 4 * 4 8 12 16 4 5 10 15 20 5 6 12 18 24 6 把表1中的数按图示斜线分组(横纵坐标和相等的数分为一组),把每组数的累加起来所得的和记在表格下方,见表 2: 表 2: 4 8 12 16 5 10 15 20 6 12 18 24 + ================= 4 13 28 43 38 24 从最低位的 24 开始,保留个位数字“4”,把个位以外的数“2”进到前一位; 把次低位的 38 加上低位进上来的 2 得 40,保留个位数字“0”,把“4”进到前一位; 以此类推,直至最高位的,得乘积答数 562704 注意:占用的线性的内存空间 为 m+n-1,也就是列数 时间复杂度为 O(SIZE(m+n-1)*SIZE(n)) ----------------------------------------------*/ int main(){ const int MAX_SIZE = 1000; int i=0,j=0,k=0; char p1[MAX_SIZE],p2[MAX_SIZE]; /*--------------------------------- 参数的输入 ---------------------------------*/ printf("输入参数1(整数):/n"); scanf("%s",p1); printf("输入参数2(整数):/n"); scanf("%s",p2); /*--------------------------------- 计算参数的大小 ---------------------------------*/ const int p1_size = strlen(p1); const int p2_size = strlen(p2); /*--------------------------------- 构建列表,行数 有参数2的大小限定,列数由 参数1+参数2-1的大小限定 ---------------------------------*/ int** buff = new int*[p2_size]; for(i = 0;i < p2_size;i++){ buff[i] = new int[p1_size+p2_size - 1]; memset(buff[i],0,sizeof(int)*(p1_size+p2_size - 1)); } for(i = 0;i < p2_size;i++){ for(j = 0,k = i;j < p1_size;j++,k++){ int a = *(p1+j) - '0'; int b = *(p2+i) - '0'; buff[i][k] = a*b; } } /*--------------------------------- 计算每一列的总和 ---------------------------------*/ int* buff2 = new int[p1_size+p2_size - 1]; memset(buff2,0,sizeof(int)*(p1_size+p2_size - 1)); for(i = 0;i < p1_size+p2_size - 1;i++){ int sum = 0; for(j = 0;j < p2_size;j++){ sum += buff[j][i]; } buff2[i] = sum; } /*--------------------------------- 从最末位开始,取进位值,取值的个位数,进位多余的 ---------------------------------*/ int* buff3 = new int[p1_size+p2_size - 1]; memset(buff3,0,sizeof(int)*(p1_size+p2_size - 1)); for(i = p1_size+p2_size - 1 - 1; i > 0;i--){ int tmp = buff2[i]/10; if( tmp > 0){ buff3[i]=buff2[i]%10; buff2[i-1]+=tmp; }else{ buff3[i] = buff2[i]; } } buff3[0] = buff2[0]; //第一列的值,做特殊的处理,不进位了 /*--------------------------------- 打印结果 ---------------------------------*/ for(i = 0;i < p1_size+p2_size - 1;i++){ printf("%d",buff3[i]); } printf("/n"); /*--------------------------------- 内存释放 ---------------------------------*/ for(i = 0;i < p2_size;i++){ delete[] buff[i]; buff[i] = NULL; } delete[] buff; delete[] buff2; delete[] buff3; return 0; }