正文

QB 的 超长数值的简单运算(未包含小数点和符号计算)2005-08-20 11:51:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/mozo/3961.html

分享到:

很多人都会说到用数组来储存各位置上的数字,
而我觉得QB里的字符串特别是不定长字符串,
使用起来很方便,所以我很喜欢用QB的字符串函数
mid$(),instr()等等,方便快捷

不定长字符串最大可以去到32767个字符,
大概已经够用的了,还不够用的话,再定义一个字符数组
转换成十六进制来计算,每一个字符代替两位十六进制数字,够恐怖的了
我觉得我这辈子都不怎么会有这个机会用得上了,否则我该进天文学研究所去了.

DECLARE FUNCTION longx$ (a$, b$)  '乘法
DECLARE FUNCTION longqu$ (a$, b$) '除法
DECLARE FUNCTION longadd$ (a$, b$)'加法
DECLARE FUNCTION longsub$ (a$, b$)'减法
DECLARE FUNCTION cut0$ (a$)
DECLARE FUNCTION dao$ (a$)

FUNCTION cut0$ (a$)
c$ = a$
l% = LEN(c$)
DO UNTIL l% <= 1
   IF LEFT$(c$, 1) < "1" THEN
      l% = l% - 1
      c$ = RIGHT$(c$, l%)
   ELSE
      EXIT DO
   END IF
LOOP
cut0$ = c$
END FUNCTION

FUNCTION dao$ (a$)
b$ = a$
l% = LEN(b$)
FOR i% = 1 TO l% \ 2
  k$ = MID$(b$, i%, 1)
  MID$(b$, i%, 1) = MID$(b$, l% - i% + 1, 1)
  MID$(b$, l% - i% + 1, 1) = k$
NEXT
dao$ = b$
END FUNCTION

FUNCTION longadd$ (a$, b$)
a1$ = dao$(LTRIM$(RTRIM$(a$)))
b1$ = dao$(LTRIM$(RTRIM$(b$)))
la% = LEN(a1$)
lb% = LEN(b1$)
IF la% > lb% THEN l% = la% ELSE l% = lb%
FOR i% = 1 TO l%
    a% = VAL(MID$(a1$, i%, 1))
    b% = VAL(MID$(b1$, i%, 1))
    c% = a% + b% + k%
    k% = c% \ 10
    c$ = c$ + CHR$(48 + c%)
NEXT
IF k% > 0 THEN c$ = c$ + CHR$(48 + k%)
longadd$ = dao$(c$)
END FUNCTION

FUNCTION longqu$ (a$, b$)
a1$ = LTRIM$(RTRIM$(a$))
b1$ = LTRIM$(RTRIM$(b$))
la% = LEN(a1$)
lb% = LEN(b1$)
FOR i% = lb% TO la%
    c1$ = LEFT$(a1$, i%)
    k% = -1
    DO
      k% = k% + 1
      c2$ = c1$
      c1$ = longsub$(c1$, b1$)
    LOOP UNTIL LEFT$(c1$, 1) = "-"
    c$ = c$ + CHR$(48 + k%)
    c2$ = RTRIM$(LTRIM$(c2$))
    l2% = LEN(c2$)
    MID$(a1$, 1, i%) = SPACE$(i% - l2%) + c2$
NEXT
     'a1$为余数
longqu$ = cut0$(c$)
END FUNCTION

FUNCTION longsub$ (a$, b$)
a1$ = cut0$(LTRIM$(RTRIM$(a$)))
b1$ = cut0$(LTRIM$(RTRIM$(b$)))
la% = LEN(a1$)
lb% = LEN(b1$)
IF la% > lb% THEN l% = la% ELSE l% = lb%
IF la% < lb% OR (la% = lb% AND b1$ > a1$) THEN
   cc$ = "-"
   SWAP a1$, b1$
END IF
a1$ = dao$(a1$)
b1$ = dao$(b1$)
FOR i% = 1 TO l%
    a% = VAL(MID$(a1$, i%, 1))
    b% = VAL(MID$(b1$, i%, 1))
    c% = k% + a% - b%
    IF c% < 0 THEN
       c% = c% + 10
       k% = -1
    END IF
    c$ = c$ + CHR$(48 + c%)
NEXT
longsub$ = cc$ + cut0$(dao$(c$))
END FUNCTION

FUNCTION longx$ (a$, b$)
a1$ = dao$(LTRIM$(RTRIM$(a$)))
b1$ = dao$(LTRIM$(RTRIM$(b$)))
la% = LEN(a1$)
lb% = LEN(b1$)
c$ = SPACE$(la% + lb%)
FOR i% = 1 TO la%
   ia% = VAL(MID$(a1$, i%, 1))
  FOR j% = 1 TO lb%
   ib% = VAL(MID$(b1$, j%, 1))
   lc% = i% + j% - 1
   ic% = ia% * ib% + VAL(MID$(c$, lc%, 1)) + k%
   IF ic% > 9 THEN
      k% = ic% \ 10
      ic% = ic% MOD 10
   END IF
   MID$(c$, lc%, 1) = CHR$(48 + ic%)
NEXT j%, i%
longx$ = dao$(RTRIM$(c$))
END FUNCTION

都是按照平时口算的方法去做的
暂时只做到整数的运算,小数点和符号的运算还没有加进来,
欢迎大家有时间帮忙提提意见如何加上小数点和符号的运算处理,
弄好后还可以加进括号的多项式计算. 

阅读(3956) | 评论(2)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

loading...
您需要登录后才能评论,请 登录 或者 注册