回 帖 发 新 帖 刷新版面

主题:[原创]竖式乘法-求哪位有更好的办法?

'类似以下的计算过程
  12
* 14
_____
  48
+12
_____
=168
'本人编了一个处理以上竖式乘法的程序如下。但个人觉得“很土,很麻烦”,是硬凑出来的结果。不知哪位大侠有更好的办法?多谢赐教。
'注意:希望大侠有一般文字说明,解释一下思路,而不要大段的程序。

CLS : INPUT a$, b$: la = LEN(a$): lb = LEN(b$)
a = VAL(a$): b = VAL(b$): btemp = b
PRINT TAB(10); a
PRINT TAB(10 + la - lb - 1); "*"; b
PRINT "___________________"
'以上乘数列表
ld = 0
FOR i = 1 TO lb
  btemp1 = btemp MOD 10: btemp = btemp \ 10
  c = a * btemp1: ctemp = c: lc = 0
  DO
    lc = lc + 1: ctemp = ctemp \ 10
  LOOP UNTIL ctemp = 0
  IF i = lb THEN
    PRINT TAB(10 + LEN(a$) - lc - ld - 1); "+"; c
  ELSE
    PRINT TAB(10 + LEN(a$) - lc - ld); c
  END IF
  ld = ld + 1
NEXT i
'以上分别写出乘的过程
PRINT "___________________"
  c = a * b: ctemp = c: lc = 0
  DO
    lc = lc + 1: ctemp = ctemp \ 10
  LOOP UNTIL ctemp = 0
  PRINT TAB(10 + LEN(a$) - lc - 1); "="; c
'以上显示乘法的结果
END

回复列表 (共5个回复)

沙发

怎么还是没人回复呀?是师道之不传,还是学艺不精啊?真让我失望!

板凳

按照现实中的习惯就可以了.
处理好位置,
处理好计算过程,就得了.

3 楼

DEFLNG A-Z
INPUT "A,B:", A, B
LB = LEN(STR$(B))
L = 5 + LB
DIM s(L) AS STRING * 10
MID$(s(1), 11 - LEN(STR$(A))) = STR$(A)
MID$(s(2), 10 - LB) = "X" + STR$(B)
s(3) = STRING$(10, "-")
FOR i = 4 TO LB + 2
    C = B MOD 10
    B = B \ 10
    D = A * C
    M = M + D * 10 ^ (i - 4)
    MID$(s(i), 15 - i - LEN(STR$(D))) = STR$(D)
NEXT
s(i) = STRING$(10, "-")
MID$(s(i + 1), 11 - LEN(STR$(M))) = STR$(M)
CLS
FOR i = 1 TO i + 1
    PRINT s(i)
NEXT

4 楼


好方法!我会学习的。多谢

5 楼

DEFLNG A-Z
INPUT "A,B:", A, B
LB = LEN(STR$(B))
L = 5 + LB           
     [color=00FF00]'这里 l=4+lb ,因为lb实际比B的字符数多1,这个1可能是符号位吧?[/color]
DIM s(L) AS STRING * 10
MID$(s(1), 11 - LEN(STR$(A))) = STR$(A) 
     [color=00FF00]'一直以为mid$(a$,n1,n2)函数只能返回字符串,这里居然能写字符串!不错。[/color]
MID$(s(2), 10 - LB) = "X" + STR$(B)
s(3) = STRING$(10, "-")     
     [color=00FF00]'又是一个字符串函数。字符串函数被用得淋漓尽致[/color]
FOR i = 4 TO LB + 2    
    C = B MOD 10
    B = B \ 10
    D = A * C
    M = M + D * 10 ^ (i - 4)
       [color=00FF00]'我把M在b未被改变之前=a*b,但那样就没模拟出乘积相加过程。还是这个好[/color]
    MID$(s(i), 15 - i - LEN(STR$(D))) = STR$(D)
NEXT
s(i) = STRING$(10, "-")
MID$(s(i + 1), 11 - LEN(STR$(M))) = STR$(M)
CLS
FOR i = 1 TO i + 1
    [color=00FF00]'这里后界完全可用L代替,当然,L要等于4+LB[/color]
    PRINT s(i)
NEXT
[color=FF0000]'我在写前面的程序时,还没学到更多的字符串函数。不过,就算我学到了,也未必想出你的方法来。佩服,多谢![/color]

我来回复

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