前言:
这是第三篇博客,也是一次介绍二个计算的博客,可能难度会比前两篇博客大一点,所以建议对于初学者来说一定要看完我的前两篇博客再来看本篇博客,关于本次实验的环境,和思想在第一篇博客已经简单介绍过了,所以不再赘述,我会先介绍大数的乘法载介绍大数的除法,乘法的难点在于要使用一个嵌套循环,除法的难点在于一个字使用符串比较方法的技巧,本次还是会将算法都写成函数,然后在main()函数中调用,原因是在第四篇我们要将整个大数运算的方法做成自己的一个库文件,可以供自己或他人使用。
大数乘法:
由于乘法可以互换所以对于输入的数字没有限制条件,计算方法还是模仿手工算法,由被乘数的低位开始和乘数的每一位相乘并且要将大于9的十位数向前进一位,存在3个问题需要我们解决。
问题:
1 我们要用多大的数组存储结果?
2 要使用嵌套循环吗?
3 如何在计算的过程中保证进位?
其实问题也很好解决,前两个问题都可以看出答案,最后一个问题和前两篇博客的进位问题很相似,所以简单的说明后再看注释的代码是很好懂的。
1 二个数相乘最大的位数是两个乘数的位数之和。
2 很明显由于乘法的特性使用嵌套循环很合适。
3 在大数加减中执行完毕后再对存储结果的result数组进行一次进位,但在乘法中我们需要每执行一趟就要对数组进行进位的处理。
实现:
下面是全面的含有注释的代码。
1 //#include"big.h"
2 #include<stdio.h>
3 #include<stdlib.h>
4 #include<string.h>
5 char * bigmul(char *m,int lena,char *f,int lenb){ //乘法运算函数。
6 int i,j,k,lensum,tmp_result,carry,num='0';
7 lensum=lena+lenb; //确定结果数组的长度。
8 for(i=0;i<lena;i++){ //将ASCII码转为对应的数字存储。
9 m[i]=m[i]-num;
10 }
11 for(i=0;i<lenb;i++){
12 f[i]=f[i]-num;
13 }
14 char *result,final[BUFSIZ];
15 result=(char*)calloc(lensum,1);
16 for(i=0;i<lenb;i++){ //为被乘数作一趟乘法。
17 for(j=0;j<lena;j++){