大整数乘法

首先说一下乘法计算的算法,从低位向高位乘,在竖式计算中,我们是将乘数第一位与被乘数的每一位相乘,记录结果,之后,用第二位相乘,记录结果并且左移一位,以此类推,直到计算完最后一位,再将各项结果相加,得出最后结果。

计算的过程基本上和小学生列竖式做乘法相同。为了编程方便,并不急于处理进位,而是将进位问题留待最后统一处理。

总结一个规律: 即一个数的第i 位和另一个数的第j 位相乘所得的数,一定是要累加到结果的第i+j 位上。这里i, j 都是从右往左,从0 开始数。
ans[i+j] = a[i]*b[j];

另外注意进位时要处理,当前的值加上进位的值再看本位数字是否又有进位;前导清零。

#include<stdio.h>
 2 #include<string.h>
 3 
 4 #define MAX 1000    // 大数的最大位数 
 5 
 6  
 7 /*
 8   大数乘法 
 9   参数: 
10   num1为第一个因数,用字符数组保存
11   num2为第二个因数
12   sum数组保存相乘的结果  即:num1*num2=sum
13   返回值:返回数组sum的有效长度,即计算结果的位数 
14  */
15 int Multiplication(char num1[],char num2[], int sum[])
16 {
17     int i, j, len, len1, len2;
18     int a[MAX+10] = {0};
19     int b[MAX+10] = {0};
20     int c[MAX*2+10] = {0};
21     
22     len1 = strlen(num1);
23     for(j = 0, i = len1-1; i >= 0; i--) //把数字字符转换为整型数 
24         a[j++] = num1[i]-'0';
25     len2 = strlen(num2);
26     for(j = 0, i = len2-1; i >= 0; i--)
27         b[j++] = num2[i]-'0';
28     
29     for(i = 0; i < len2; i++)//用第二个数乘以第一个数,每次一位 
30     {
31         for(j = 0; j < len1; j++)
32         {
33             c[i+j] += b[i] * a[j]; //先乘起来,后面统一进位
34         }
35     }
36     
37     for(i=0; i<MAX*2; i++) //循环统一处理进位问题
38     {
39         if(c[i]>=10)
40         {
41             c[i+1]+=c[i]/10;
42             c[i]%=10;
43         }
44     }
45 
46     for(i = MAX*2; c[i]==0 && i>=0; i--); //跳过高位的0
47     len = i+1; // 记录结果的长度 
48     for(; i>=0; i--)
49         sum[i]=c[i];
50     return len; 
51 }
52 
53 int main()
54 {
55     int i, len;
56     int sum[MAX*2+10] = {0}; // 存放计算的结果,低位在前,高位在后,即sum[0]是低位 
57     char num1[] = "123456789123456789"; // 第一个大数 
58     char num2[] = "123456789123456789"; // 第二个大数 
59     len = Multiplication(num1, num2, sum);
60     // 输出结果
61     printf("%s\n  *\n%s\n  =\n", num1, num2);
62     for(i = len-1; i>=0; i--)
63         printf("%d", sum[i]); 
64     printf("\n"); 
65     return 0;
66 } 


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值