正文

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

阅读(4115) | 评论(2)


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

评论

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