用c语言字符串实现多位整数的高精度计算,用C语言字符串实现多位整数的高精度计算...

C语言程序设计

用&语言字符串实现多位整数的高精度计算

蒋晓明,徐启振

(华北科技学院计算机系,北京’"’$"’)

【摘要】本文通过对&语言字符串的应用,解决了高级程序设计语言处理数据存储空间的问题,实现了高级语言数据类型无法完成的,多位整数、高精度减法、除法计算,并对其实现算法进行了简要的分析和介绍。

【关键词】程序设计语言字符串存储空间多位整数高精度计算引言’、

多数高级程序设计语言,对存储、处理的数据都被分为各种数据类型,不同类型的数据分配存储空间不同,但每一种类型的存储空间大小是一个定值,从而对数据位数和精度有一定的限制。那么如何处理任意位的数据运算就成为大家共同研究的课题。例如两个百位整数要进行四则运算,由于位数太长,无论使用任何程序设计语言、任何类型数据都处理不了,因此必须编制专门的程序来解决此问题。算法分析!、

经过笔者分析,解决位数过长的四则运算可以使用如下两种方法:

一是采用字符串,即把处理数值改为处理字符串,因为字符串没有长度限制,且字符串中的每一字符正好可以对应长整数中的一位数字。把长整数的加减乘除,转化为字符串的加减乘除,需特殊处理的一是计算时要把每一位字符减#(转换为数值,计算后再把相应结果加#(转换为字符,另外还需注意加乘进位、减借位的处理。

二是采用链表,用链表的每一结点存储一位数字或多位数字。把长整数的加减乘转化为链表各结点的加减乘,进位、借位处理同上。

比较以上各种方法:采用字符串,需预先定义运算字符数组长度,可能造成部分空间浪费;采用每一结点存储多位数字的链表,较节省空间,但处理较复杂;采用每一结点存储一位数字的链表,虽然比每一节点存储多为数字处理简单,但也需进行字串到链表、链表到字串的转换、链表添加、删除处理等,程序中即需处理字串,还得处理链表,因此本程序采用单一字符串来实现。

现以减法为例,具体处理步骤如下:以字符串形式输入两长整数。’、

将各字符串翻转处理,转化后低位在前,高位在后。!、

将字符串*、即低位至高位对应位置相减,并)、+从前至后,

将结果重新保存至结果字符串*对应位置中,被减位小于减位时要借位加’",借位到下一位相减时作减’处理。

如:输入字符串数据###,$!’"-#’!)(#,生成的新字符串*结果:

减法/01231*4567*8#*967*8#+:;;减法函数,传入被减’、

数、减数,函数结束后被减数为差。如传入*+字串为##,$!’"、

则相减差结果为#)(!$。##’!)(#,

<14=1>"93?>"@;;定义1为位指针,3?为借位

低位在前,高位在后AB5*:@AB5+:@;;将两传入字串翻转,

并将数字转为字符?71CD5#5+E1:F>G1:-#5+E1:-3?EG"G@;;相减,

借位处理1A5#5*E1:HG"G:;;减为负数时,

#5*E1:E’"@

3?>’@IDCJD3?>"@1EE@I

?71CD5#5*E1:F>GK"G:;;当减数没结束时落位处理<5*E1:>#5*E1:-3?@1A53?>>’:3?>"@1EE@I

#5*E1:>GK"G@

低位在后AB5*:@AB5+:;;将结果翻转回高位在前,

I

除法67*8#67L567*8#*967*8#+967*8#.914=32:;;除法函!、数,传入被除数、除数、精度,返回相除商及余数。

<14=1>"9M96>"@

67*8#**>N*CC065J=8CD45*:E32E’:@67*8#J>N*CC065J=8CD45*:E32E!:@J=86O.5**9*:@M>J=8CD45*:@

;;按精度数在被除数后加"A0851>"@1H32@1EE:#5**EME1:>G"G@

5:GG#**EME1>K"@M>"91>’@

?71CD51HJ=8CD45**::

#5**E1:@#5.E6E’:>GK"G@;;分别取被除数中各位,加到临

时被除数末尾

#5JEM:>G"G@;;商位初始化为"

55::当临时被除数大于除数时,循环相减,商位加’?71CD+3.9+P>";;<31*45.9+:@

则删除2DCC5.:@;;相减后如被减数前导出现",

#5JEM:>#5JEM:E’@I6>J=8CD45.:@MEE@1EE@I#5JEM:>GK"G@;;删除商前导"5:处理小数点后位数1A32P";;如果有精度,<1>J=8CD45J:@

如Q;%"精确到小数点后!位,相除结果为1A51H>32:;;商长度小于精度数,

A085M>"@MH>32-1@MEE:#5JE1EM:>G"G@#5JE1EM:>GK"G@AB5J:@

1>32E’@I

如""QA085M>"@MH32@MEE:#5JE1-M:>#5JE1-’-M:@;;加入小数点,

加小数点后为"R"Q

#5JE1-M:>GRG@#5JE1E’:>GK"G@I8D=L84J@I

程序中使用到的其他函数及主函数)、

链表相加和减法类似,只是结点相减改为结点相加、借位#、

改为进位;字串相乘时应注意乘数、被乘数当前结点和积当前结点的位置,及乘数、被乘数结点移动时积结点的变化;相除时需被除数、除数的顺序反转,高位在前低位在后,然后是取被除数的前几位和除数作循环减法,不够减时加一位继续减直到被除数结束,即化除法为减法。除法函数中,循环相减最后剩下的.串为相除余数。程序实现)、

/012AB567*8#*:;;字串翻转

<14=C>J=8CD45*:9M9=DNO@

A085M>"@MHC;!@MEE:<=DNO>#5*EM:@#5*EM:>#5*EC-M-’:@#5*EC-M-’:>=DNO@II/0122DCC567*8#*:;;删除前导字符"<14=4>"91>"@

?71CD5#5*E4:>>G"G:4EE@

全删除?71CD5#5*E4:F>GA51>>":G"G@1EE@I;;如只有"时,

后要补回’个"

#5*E1:>GK"G@I

大于返回’小于返回-’等于14=+3567*8#J=8C967*8#J=8!:;;比较两数字串大小,

时返回"

<14=C*>J=8CD45J=8’:9C+>J=8CD45J=8!:91>"@

5下转第’#页

1-321-png_6_0_0_94_925_372_120_936_1296-1031-0-1308-1031.jpg

:1A5C*HC+:8D=L84-’@

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值