回 帖 发 新 帖 刷新版面

主题:下面的我计算长整数减法的程序,请看看错在什么地方

DIM x AS STRING, y AS STRING
DIM lenx AS INTEGER, lenY AS INTEGER
DIM result AS STRING

INPUT "x="; x   'x:big
INPUT "y="; y   'y:small
lenx = LEN(x)
lenY = LEN(y)
y = STRING$(lenx - lenY, " ") + y
PRINT " "; x
PRINT "-"; y
PRINT STRING$(lenx + 1, "-")

FOR i = lenx TO 1 STEP -1
        IF VAL(MID$(x, i, 1)) >= VAL(MID$(y, i, 1)) THEN
                result = RIGHT$(STR$(VAL(MID$(x, i, 1)) - VAL(MID$(y, i, 1))), 1) + result
        ELSE
                result = RIGHT$(STR$(VAL(MID$(x, i, 1)) + 10 - VAL(MID$(y, i, 1))), 1) + result
                [b]x = LEFT$(x, i - 2) + RIGHT$(STR$(VAL(MID$(x, i - 1, 1)) - 1), 1)[/b]
        END IF
NEXT

DO
        IF LEFT$(result, 1) = "0" THEN
                result = RIGHT$(result, LEN(result) - 1)
        ELSE
                EXIT DO
        END IF
LOOP
PRINT STRING$(lenx - LEN(result) + 1, " "); result


要求输入的必须是形如"2354235"这样的数值,没有正负号,也没有小数点并且一定是x>=y(这里没有对x和y的合法性进行验证),估计是加粗那一行,也就是处理进位的部分错了.求改正!(如果有更好的方法,只要是qb实现的)也请发.

回复列表 (共1个回复)

沙发

我记得以前好像写过类似的函数。
不过,好像太久了,记不起来了。

在你的程序里,按照直观的处理办法来做代码,按道理并没有错。
只是你在借位的时候,忽略了 0 ,如果上一位是 0 ,你该怎样借位?
出错的正是你加粗的那一行代码,按照你的处理,假如那一位数字是 0 ,
你再减1 ,就变成了 chr(47),  <斜杠 “/”>
斜杠在下一位运算的时候,很明显的就开始出错了。

因为你的代码里,没有验错的过程,也就是说,我们假设两个输入并没有特殊的错误。
(例如插入了其它符号、长短、大小、正负之类的)

在借位的时候,可以利用中间变量来处理。
借位,初始值为0,加入到被减数去。
不够减的时候,被减数+10,借位值为-1,供下次运算使用。

我来回复

您尚未登录,请登录后再回复。点此登录或注册