不限制位数的整数高精度加法★★★★
这是“高精度算法”系列文章中的第一篇,实际上是最基础、最重要的一篇。因为“高精度加、减、乘、除”的一些最基本的技巧已经差不多都使用上了。在这4种计算中,加法最基础、最简单,乘法稍难,减法更难,除法最难。
LOGO语言在计算能力上的致命缺点是没有“长整数”,没有“高精度小数”,“数”和“字符串”的概念含混。这就导致有些在其他种类语言中比较容易的题目,在LOGO语言中显得较为麻烦。
但是这并不是就此无所作为。我们仍然坚信:“没有编写不出来的程序,只有还没有被想出来的方法”。坚信这样的信条,处理这些本来看起来不可能有解的难题,总有解决的办法。林老师平时能够使用LOGO、VB、C、PASCAL、C++、FORTRAN等计算机程序设计语言编程,林老师的经验是:假如这道题你用LOGO能够编写,那么你使用其他语言编写这道题目的程序,只会更加容易一些。所以用LOGO语言来“练兵”,是有实战意义的。
诀窍①:在一长串的数字前面随意加上一个字符,LOGO系统就会把它作为字符串处理,而不会变成讨厌的无法处理的“科学计数法”数字。
诀窍②:在处理这些数时,去掉前面的字符,把后面的数字一个个用ITEM命令剪切下来,即是把数位分离开来。
诀窍③:记住,这时被剪切出来的数位还是字符,所以要用ASCII命令读出ASCII值,再减去48,这时的值已经还原成“数字”。
诀窍④,用FOR循环从低位开始向高位进行加法,加出来的结果存在第3个数组中,凡是一个位上加出来的值大于9的话,就要向高位“进位”。
诀窍⑤,说到这里简直都不能成为“诀窍”了,因为情况已经很清楚了,当然最后一步是把计算结果显示出来。
判断你懂了没有,不是看懂了程序就算数,而是如果及自己重新编写一次,假如能行的话,那才是完全彻底的明白了
TO JIA_N ;任意位数加法
PR
"请输入第一个加数并在数字前加上1个任意字母:
MAKE "A
READ ;从键盘上读入第一个数
MAKE "A1 COUNT
:A ;测试数的长度
PR
"请输入第二个加数并在数字前加上1个任意字母:
MAKE "B
READ ;从键盘上读入第二个数
MAKE "B1 COUNT
:B ;测试数的长度
IF
:A1>:B1 THEN[MAKE "C :A1]ELSE[MAKE "C
:B1]
;计算求和空间的最大长度
MAKE "JA
BYTEARRAY
:C ;建立第一个加数存储空间
MAKE "JB
BYTEARRAY
:C ;建立第二个加数存储空间
MAKE "JC
BYTEARRAY
:C+2 ;建立储存和的空间
FOR "I 1
(:A1-1)[ASET :JA :I (ASCII(ITEM :A1-:I+1 :A))-48]
;将第一个数字拆位存储
FOR "I 1
(:B1-1)[ASET :JB :I (ASCII(ITEM :B1-:I+1 :B))-48]
;将第二个数字拆位存储
FOR "I 1
(:C-1)[ASET :JC :I (AGET :JA :I)+(AGET :JB :I)]
;进行加法
FOR "I 1
(:C-1)[IF 9
ASET :JC :I (AGET :JC :I)-10
ASET :JC :I+1 1+AGET :JC :I+1]] ;处理进位
;===============显示输出算式=================
FOR "I 1
(:A1-1)[TYPE AGET :JA :A1-:I] ;显示第一个加数
TYPE[+]
FOR "I 1
(:B1-1)[TYPE AGET :JB :B1-:I] ;显示第二个加数
TYPE[=]
;===============显示输出答案=================
IF (AGET :JC
:C+1)>0 THEN TYPE AGET :JC :C+1
IF (AGET :JC
:C)>0 THEN TYPE AGET :JC :C
;显示可能存在的最高位
FOR "I 2
:C[TYPE AGET :JC :C-:I+1]
;显示其它数位
PR[] ;中断接连的显示输出
END
计算实例:
JIA_N
请输入第一个加数并在数字前加上1个任意字母:
? A123456789
请输入第二个加数并在数字前加上1个任意字母:
? A987654321
123456789+987654321=1111111110
? JIA_N
请输入第一个加数并在数字前加上1个任意字母:
? A991234567894567
请输入第二个加数并在数字前加上1个任意字母:
? A98776544432
991234567894567+98776544432=991333344438999
? JIA_N
请输入第一个加数并在数字前加上1个任意字母:
? A999999999123456789
请输入第二个加数并在数字前加上1个任意字母:
? A876543211
999999999123456789+876543211=1000000000000000000
? JIA_N
请输入第一个加数并在数字前加上1个任意字母:
? A25008365428791263748
请输入第二个加数并在数字前加上1个任意字母:
?
A665372654312993754310008377
25008365428791263748+665372654312993754310008377=665372679321359183101272125
这里是新颖有趣的LOGO、DEV-C++语言之家
欢迎评论 欢迎转载
查找林老师博客最便捷的方法:
在百度、谷歌、搜狗、搜搜、雅虎、有道等搜索引擎中输入
林老师 LOGO
就能找到林老师博客文章了
查阅林老师最新发表文章的链接:
快速检索数百篇博客提高阅读效率的链接:
因网络拥挤“纸条”常不能及时打开查阅。有信息尽量使用“评论”或邮件。
需要LOGO系统文件常用表格工具文件及DEV-C++系统文件的可以发邮件给林老师
声明:
林正山老师发表的文章及照片,媒体、网站或出版物未经本人许可谢绝进行任何形式的删节、改编、重组及转载。
允许个人博客按原文(含图片及附注)进行完整转载,转载时敬请注明本博作者姓名、文章原始出处,并以链接形式标明来源。