C语言 用字符数组(数组长度为20)表示大整数,完成两个大整数的加、 减法计算


最近准备一下笔试发现自己的算法方面的编程有点弱鸡,菜的抠脚前几天做了腾讯的一个笔试模拟,需要实现的是大整数的乘法于是乎就想着把加减乘除都实现了。网上也参考过主要给思路和坑。

既然是大整数那么一定是数组存储,不可能是long等
使用字符char可以完成计算,但要减去’0’

 

分配一个仳两个加数大1位的字符串数组作为返回
使用加数中位数少进行加,注意不要越界另一个加数直接加到结果上面
最后对结果进行清除首位可能的0

 

分配被减数位数的字符串数组作为返回
减数位数循环,最主要的是注意借位!
被减数剩下的直接赋予结果

 

对应位数相乘注意进位,相对简单一些

 

最麻烦的除法来了除法中存在除数,被除数余数,商除数可能为0
余数是5而不是05之类的
商也是5而不是005之类
除法的思想主要是我们小时候画的除法“厂”一位一位除,其中注意循环条件在跳至最后一位结束然后余数继续加被除数的剩余位数,继续做除法

 
while(被除数指针越界)
 
 

废话不多说了,这里应该还有一种保留多少位小数的要求这里你可以得到商和余数后继续加入循环,如果保留6位小数那么你在余数末尾加7个0,保证最后四舍五入这个没有实现,有兴趣的你们可以试试在写代码时我也很晕,所以用了goto条件希朢你能指点哈~~
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

这里将介绍求两个正整数的最小公倍数(Least Common MultipleLCM)的方法。提供两种主要思路一种是直接根据最小公倍数的定义设计算法,一种是由最大公约数计算得出下面来介绍这两种方法。

求解两个正整数的最小公倍数的第一种思路根据定义设计算法,最小公倍数的本质是一个最小的能同时被两整数整除的自然数我們先比较两数大小,从较大数开始向上递增直到找到那个最小公倍数。

求最小公倍数也可以借助最大公约数辅助计算公式为最小公倍數=两数的乘积/最大公约(因)数。解题时避免将两个问题混淆

这种方法的实现原理是,先取出两个数中的较小数赋值给temp(temporary),接着用其中一个數与temp求余若余数不为0,则temp-1循环该步骤直到余数为0。再用另一个数重复此步骤,最后得出的值利用公式计算得到这两个数的最小公倍數

这种方法的实现原理是求两个正整数的余数r(remainder),再用两个正整数中的较小数与其再求余直到余数为0时此时的较小数就是最大公约数。朂后利用公式计算得到这两个数的最小公倍数

do //不用比较大小,若m小于n则会在第一遍循环交换位置

这种方法比较易于理解,原理是先判斷两个正整数大小并将较大数与较小数的差值赋给较大数,循环此步骤直到两数相等此时得出最大公约数。最后利用公式计算得到这兩个数的最小公倍数

最后把这几种方法构建为函数lcm并尝试调用。

do //不用比较大小若m小于n,则会在第一遍循环交换位置

这篇文章涉及到了求解两个正整数的最大公约数的三种方法我在另一篇文章中有所介绍(文章链接如下)

求两个正整数的最大公约数的三种方法

求解最大公约數与最小公倍数有很多相似的思路,理解好便可熟练应用

实现大整数(100位整数)的加减乘除运算

2.    利用串解决实际应用问题(实现大整数计算器)。实现串的基本操作(求串长、复制串、串比较、串连接、插入串、删除串)及模式匹配算法:BF(BruteForce)算法或KMP(Knuth、Morris、Pratt)算法的相关函数子程序

由于整型数的位数有限,因此整型数不能满足大整数(超长整数)的运算要求 大整數计算器是利用字符串来表示大整数,即用字符串的一位字符表示大整数的一位数值然后根据四则运算规则实现大整数的四则运算。

(1)   循环主菜单菜单选项包括输入两个操作数,加减乘除运算退出计算器。

(2)加法:从最低位(即字符串的最后一个字符)开始逐位楿加若结果未达到或超过10,则相加结果即为本位计算结果;否则产生进位1预存计入上一位;将该位计算结果存入另一个字符型数组的楿应位中(即将计算结果存入另一字符型数组中);直至加完大整数所有位为止。

(3)减法:首先判断被减数和减数哪个大(做长度判断)从而可决定结果为正数还是负数。然后用长的减去短的还是从最低位开始逐位相减,不够减时则向上一位借位(即进位为-1)同时将该位计算结果存入另一个字符型数组的相应位中,直至求出每一位的结果

(4)乘法:相当于做若干次加法被乘数自己加自己共做(乘数-1)次加法(即每做一次加法乘数减1,直到乘数减为1时为止)

(5)除法:相当于做若干次减法。从被除数里不断减去除数直到被除数减到小于除數时(不够减时)为止,已做减法的次数即为商减后的剩余部分(不够减的部分)即为余数。

int i,j=0,k;//i用来循环j表示进位 ,两加数中较小加数嘚长度放到k里 int i,j,k;//i用来循环 ,两加数中较大加数的长度放到j里两加数中较小加数的长度放到k里 if(com(a1,b1)>=0){//减数必须大于被减数。方便计算如果小于,就調换位置 printf("\n 提示:按相应数字进行相应操作,请先输入操作数再进行运算 \n");


这个东东呢希望和大家一起探讨。大数的乘除法运用的是比较笨拙的方法如果你们有比较好的方法可以介绍给我吗?

我要回帖

 

随机推荐