C语言大数运算-乘除法篇

前言:
这是第三篇博客,也是一次介绍二个计算的博客,可能难度会比前两篇博客大一点,所以建议对于初学者来说一定要看完我的前两篇博客再来看本篇博客,关于本次实验的环境,和思想在第一篇博客已经简单介绍过了,所以不再赘述,我会先介绍大数的乘法载介绍大数的除法,乘法的难点在于要使用一个嵌套循环,除法的难点在于一个字使用符串比较方法的技巧,本次还是会将算法都写成函数,然后在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++){
 
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值