主题:来就送分!
wangyunchaoPIG
[专家分:130] 发布于 2007-05-01 16:49:00
求高精度加、减、乘、除、乘方、阶乘(附解释!)
做出来得20分,好,得30分(分6各帖子,每个20/30分)
回复列表 (共11个回复)
沙发
&佑慧妹妹& [专家分:660] 发布于 2007-05-01 17:06:00
我能给你思路,至于程序,有时间我再打给你
这是乘法和阶乘的思路
①读入被乘数s1,乘数s2
②把s1、s2分成4位一段,转成数值存在数组a,b中;记下a,b的长度k1,k2;
③i赋为b中的最低位;
④从b中取出第i位与a相乘,累加到另一数组c中;(注意:累加时错开的位数应是多少位)
⑤i:=i-1;检测i值:小于k2则转⑥,否则转④
⑥打印结果
板凳
&佑慧妹妹& [专家分:660] 发布于 2007-05-01 17:24:00
高精度加法
CLS
INPUT a$, b$
a = LEN(a$): lb = LEN(b$)
da = INSTR(a$, "."): db = INSTR(b$, ".")
IF da = 0 THEN a1 = la ELSE a1 = da - 1: a2 = la - da
IF db = 0 THEN b1 = lb ELSE b1 = db - 1: b2 = lb - db
IF a1 > b1 THEN m1 = a1 ELSE m1 = b1
IF a2 > b2 THEN m2 = a2 ELSE m2 = b2
DIM a$(-m1 TO m2), b$(-m1 TO m2), c$(-m1 TO m2)
FOR i = -a1 TO a2: a$(i) = MID$(a$, a1 + i + 1, 1): NEXT i
FOR i = -b1 TO b2: b$(i) = MID$(b$, b1 + i + 1, 1): NEXT i
FOR i = m2 TO -m1 STEP -1
IF i <> 0 THEN
x = VAL(a$(i)) + VAL(b$(i)) + c
IF x >= 10 THEN c = 1 ELSE c = 0
END IF
c$(i) = LTRIM$(STR$(x MOD 10))
NEXT i
PRINT SPC(m1 - a1 + 1); a$
PRINT "+"; SPC(m1 - b1); b$
PRINT STRING$(m1 + m2 + 3, "-")
IF c <> 0 THEN PRINT USING "#"; c; ELSE PRINT " ";
FOR i = -m1 TO m2
IF i = 0 THEN
IF (a2 <> 0 OR b2 <> 0) THEN PRINT ".";
ELSE
PRINT c$(i);
END IF
NEXT i
END
还有一种打印非常好看:
CLS
INPUT "shu a="; a$
INPUT "shu b="; b$
la = LEN(a$): lb = LEN(b$)
IF lb > la THEN SWAP a$, b$: SWAP la, lb
n = la + 1: DIM a(n), b(n)
FOR i = 1 TO la: a(i) = 0: b(i) = 0: NEXT i
FOR i = 1 TO la
x$ = MID$(a$, n - i, 1)
IF x$ >= "0" AND x$ <= "9" THEN
a(i) = VAL(x$)
ELSE
PRINT "X!": END
END IF
NEXT i
FOR i = 1 TO lb
y$ = MID$(b$, lb + 1 - i, 1)
IF y$ >= "0" AND y$ <= "9" THEN
b(i) = VAL(y$)
ELSE
PRINT "X!": END
END IF
NEXT i
FOR i = 1 TO la
x = a(i) + b(i)
a(i + 1) = a(i + 1) + x \ 10
a(i) = x MOD 10
NEXT i
PRINT TAB(4); a$
PRINT TAB(1); "+";
PRINT TAB(4 + (la - lb)); b$
PRINT TAB(1); "-";
FOR i = 1 TO 10
PRINT TAB(i + 1); "-";
NEXT i
IF a(n) = 0 THEN n = n - 1
FOR i = n TO 1 STEP -1
PRINT TAB(4 + n - i); MID$(STR$(a(i)), 2);
NEXT i
3 楼
&佑慧妹妹& [专家分:660] 发布于 2007-05-01 17:25:00
如果你需要解释——
输入A$和B$
定义A数组(长为A$的长度),B数组(长为B$的长度)
先将A$ B$分离,分别存入A数组和B数组
将数组和B数组相加,如不需进位,就把数存在A(I)数组中,如需进位,将A(I)的十位存入A(I+1)数组(A(I+1)=A(I+1)+A(I)\10),A(I)的各位(A(I) MOD 10)依然存在A(I)里
输出
4 楼
&佑慧妹妹& [专家分:660] 发布于 2007-05-01 17:33:00
乘法
CLS
INPUT A$
INPUT B$
PRINT A$; "*"; B$; "=";
LA = LEN(A$): LB = LEN(B$): LC = LA + LB
DIM A(LA), B(LB), C(LC)
FOR I = 1 TO LA: A(I) = VAL(MID$(A$, LA + 1 - I, 1)): NEXT I
FOR I = 1 TO LB: B(I) = VAL(MID$(B$, LB + 1 - I, 1)): NEXT I
FOR I = 1 TO LA: FOR J = 1 TO LB
X = A(I) * B(J): W = I + J - 1
C(W) = C(W) + X MOD 10
C(W + 1) = C(W + 1) + C(W) \ 10 + X \ 10
C(W) = C(W) MOD 10
NEXT J, I
WHILE C(LC) = 0 AND LC > 1: LC = LC - 1: WEND
FOR I = LC TO 1 STEP -1
PRINT USING "#"; C(I);
NEXT I
END
5 楼
&佑慧妹妹& [专家分:660] 发布于 2007-05-01 17:36:00
阶乘
CLS
DIM a(100), b(100)
10 INPUT n
IF n > 50 THEN GOTO 10
a(1) = 1: m = 1
FOR i = 1 TO n
FOR j = m TO 1 STEP -1
a(j) = a(j) * i
IF a(j) > 99 THEN
a(j + 1) = a(j + 1) + a(j) \ 100
a(j) = a(j) MOD 100
END IF
NEXT j
IF a(m + 1) > 0 THEN m = m + 1
FOR w = m TO 1 STEP -1
b(w) = b(w) + a(w)
IF b(w) > 99 THEN
b(w + 1) = b(w + 1) + b(w) \ 100
b(w) = b(w) MOD 100
END IF
NEXT w
NEXT i
x = m
FOR i = x TO 1 STEP -1
IF b(x) > 99 THEN
b(i + 1) = b(i) \ 100
b(i) = b(i) MOD 100
IF i = x THEN m = x + 1
END IF
NEXT i
FOR i = m TO 1 STEP -1
q$ = LTRIM$(STR$(b(i)))
PRINT q$;
NEXT i
end
6 楼
&佑慧妹妹& [专家分:660] 发布于 2007-05-01 17:37:00
让我休息一下,累死了,呼呼
7 楼
&佑慧妹妹& [专家分:660] 发布于 2007-05-01 17:41:00
这是除法中的一种
CLS
INPUT a,b,c
s$ = "0."
FOR i = 1 TO c
x = a * 10 \ b
a = a * 10 MOD b
s$ = s$ + LTRIM$(STR$(x))
NEXT i
PRINT s$
END
A是被除数,B是除数,C是你要除到商的哪一位
8 楼
Matodied [专家分:7560] 发布于 2007-05-01 17:44:00
加法:
CLS
INPUT a$, b$
la = LEN(a$): lb = LEN(b$)
PRINT a$; "+"; b$; "=";
IF la < lb THEN SWAP la, lb: SWAP a$, b$
DIM a(la), b(la), s(la + 1)
FOR i = 1 TO la: a(i) = VAL(MID$(a$, la + 1 - i, 1)): NEXT i
FOR i = 1 TO lb: b(i) = VAL(MID$(b$, lb + 1 - i, 1)): NEXT i
FOR i = 1 TO la
s(i) = s(i) + a(i) + b(i)
IF s(i) >= 10 THEN s(i) = s(i) - 10: s(i + 1) = s(i + 1) + 1
NEXT i
IF s(i) = 1 THEN ls = la + 1 ELSE ls = la
FOR i = ls TO 1 STEP -1
PRINT RTRIM$(LTRIM$(STR$(s(i))));
NEXT i
END
9 楼
Matodied [专家分:7560] 发布于 2007-05-01 17:50:00
减法:
CLS
INPUT a$, b$
la = LEN(a$): lb = LEN(b$)
PRINT a$; "-"; b$; "=";
IF la < lb OR la = lb AND a$ < b$ THEN SWAP la, lb: SWAP a$, b$: PRINT "-";
DIM a(la), b(la), s(la)
FOR i = 1 TO la: a(i) = VAL(MID$(a$, la + 1 - i, 1)): NEXT i
FOR i = 1 TO lb: b(i) = VAL(MID$(b$, lb + 1 - i, 1)): NEXT i
FOR i = 1 TO la
s(i) = s(i) + a(i) - b(i)
IF s(i) < 0 THEN s(i) = s(i) + 10: s(i + 1) = s(i + 1) - 1
NEXT i
FOR i = la TO 1 STEP -1
PRINT RTRIM$(LTRIM$(STR$(s(i))));
NEXT i
END
10 楼
Matodied [专家分:7560] 发布于 2007-05-01 17:53:00
乘法:
CLS
INPUT a$, b$
la = LEN(a$): lb = LEN(b$)
PRINT a$; "*"; b$; "=";
DIM a(la), b(lb), s(la + lb)
FOR i = 1 TO la: a(i) = VAL(MID$(a$, la + 1 - i, 1)): NEXT i
FOR i = 1 TO lb: b(i) = VAL(MID$(b$, lb + 1 - i, 1)): NEXT i
FOR i = 1 TO la: FOR j = 1 TO lb
d = a(i) * b(j): v = i + j - 1
s(v) = s(v) + d MOD 10
s(v + 1) = s(v + 1) + s(v) \ 10 + d \ 10
s(v) = s(v) MOD 10
NEXT j, i
IF s(la + lb) = 0 THEN ls = la + lb - 1 ELSE ls = la + lb
FOR i = ls TO 1 STEP -1
PRINT RTRIM$(LTRIM$(STR$(s(i))));
NEXT i
END
我来回复