前言:
本篇博客将分为4到5篇来和大家一块讨论大数的加减乘除,然后再将运算做成一个大数运算库。其中除法较为棘手,但如果作完前三个运算后就没有什么难度了。虽然大多主流的编程语言如java,c++,都有大数运算库,可是c语言标准库并没有提供的大数运算,网上的c语言大数运算大多散而不周或过于复杂,所以本人决定写博客做一些简单的介绍,由于本人水平有限,如有错误或者bug请大家批评指正我会第一时间更正。
开发环境:
本人没有windows电脑,所有的编写测试都是在centos 3.10.-514.6.1.el7.x86_64 和 gcc 4.8.5 下做的,windows平台下没有任何测试,所以如果windows下出现错误我也无能为力。
总体思路:
加法和减法类似,乘法和除法类似,我们会先从大数加减法开始然后是乘除法。使用数组作为数据结构保存用户的输入和结果,主要就是将大数的整体运算转换为每一个数组元素的运算,难点也就在转换上。
大数减法:
假设 :
用户输入的数据保存在数组adda与数组addb中,adda={1,2,3,4,5,6,7,8,9};addb={1,2,3,4}。如果模仿手工计算,从低位到高位以次先加,满十则进一,那么将会有两个问题要解决。
问题:
1.用数组保存结果那么结果的长度是多少位?
2.如何写一个满十进一的算法。
其实这两个问题也很简单:
1.二个数相加结果最大只会比较大的数多一位,所以:用lensum代表结果的长度lena代表adda的长度,lenb代表addb的长度。
lensum=lena>lenb?lena:lenb;
lensum++;
就可以确定结果数组的长度。
2.如果每加一位就判断是否进一的话问题就会复杂一点,所以我们可以先保存每一位相加的结果然后在对结果进行处理如图。
一次性对result进行处理就很好实现:
for(i=lensum-1;i>0;i--){
if(result[i]>9){
result[i]=result[i]%10;
result[i-1] += 1;
}
}
<