回 帖 发 新 帖 刷新版面

主题:怎么写高精除法

怎么写高精除法,请加注释,谢谢

回复列表 (共23个回复)

11 楼

这应该是模拟数学运算法,你把这个过程想成一个除法竖式的计算过程。

M: 除数的位数
P: 除数

1) 取被除数的前 M 位 = N
2) 判断 N > P? 如果大于,把 N / P 的结果取整放到结果数组 A 中,如果不大于,多取一位,重复 2,直到 N > P
3) N - P * A(此次的结果), 得出剩下的余数
4) 从被除数上弄下一位,重复 2) 直到余数为 0

12 楼

DIM a AS INTEGER
DIM b AS INTEGER
DIM n AS INTEGER
DIM jg AS STRING
DIM s AS INTEGER
DIM ys AS INTEGER
DIM m AS INTEGER
DIM i AS INTEGER
m = 0
a: INPUT "a,b,n?", a, b, n     “a是被除数,b是除数,n是保留的有效位数”
s = a \ b
IF s = 0 THEN
   jg = "0."
   ys = a MOD b
   a = ys * 10
   s = a \ b
   DO WHILE s = 0
      jg = jg + "0"
      a = ys * 10
      s = a \ b
      ys = a MOD b
   LOOP
   GOTO o
ELSE
   jg = RTRIM$(LTRIM$(STR$(s)))
   m = LEN(jg)
   jg = jg + "."
   a = (a MOD b) * 10
o: FOR i = 1 TO n - m
      ys = a MOD b
      s = a \ b
      jg = jg + RTRIM$(LTRIM$(STR$(s)))
      a = ys * 10
   NEXT i
END IF
PRINT jg
END



用最简单的QB编的,本人是个职高生刚学QB不久,所以写的有些乱,请谅解!

13 楼

哦,对,是用字符串和整数数组相互转换然后再解的!
但是还是请讲一下啊,我还是不懂啊!

14 楼

除法就是移位减法。
其过程跟小学的时候学的竖式除法差不多。

15 楼

type
  unmtype=record
  n:array[1..7777]of longint;
  p:longint;
  end;
var
  c,s:unmtype;
  j,n:longint;
procedure plus(var a:unmtype;b:unmtype);     {加法}
var
  i,x:longint;
begin
  if a.p>=b.p
    then x:=a.p
    else x:=b.p;
  for i:=1 to x do
    begin
      a.n[i]:=a.n[i]+b.n[i];
      a.n[i+1]:=a.n[i+1]+a.n[i] div 10;
      a.n[i]:=a.n[i] mod 10;
    end;
  while a.n[a.p+1]<>0 do
    a.p:=a.p+1;
end;
procedure multiply(var a:unmtype;b:longint); {乘法}
var
  i:longint;
begin
  a.n[1]:=a.n[1]*b;
  for i:=2 to a.p do
    begin
      a.n[i]:=a.n[i]*b;
      a.n[i]:=a.n[i]+a.n[i-1] div 10;
      a.n[i-1]:=a.n[i-1] mod 10;
    end;
  while a.n[a.p]>=10 do
    begin
      a.p:=a.p+1;
      a.n[a.p]:=a.n[a.p-1] div 10;
      a.n[a.p-1]:=a.n[a.p-1] mod 10;
    end;
end;
{减法上同加法,除法上同乘法}

16 楼

这是pascal啊,我看不懂啊!
我的问题是,比如,一个100位的数字和99位数字相除,除过后被除数下一位的进位问题怎么解决,还有小数点问题怎么解决!
感谢大家的关心!

17 楼

试商法
需要提前写一个高精度乘法

18 楼

加法:(除法的按照这样的方法可写出)
program gaojingduplus;
type num=array [1..500] of integer;
var a,b:num;
    s:string;
begin
  readln(s);{读取数据}
  len:=length(s);{数据长度}
  a[i]:=b[i]+a[i];{各个位上的数相加}
  a[i+1]:=a[i] div 10;{进位}
  a[i]:=a[i] mod 10;
  if a[i+1]<>0 then do
   begin
     len:=len+1;{判断数据长度}
   end;
end.
我是新手,如有错误,恳请指正!

19 楼

15楼的:
if a.p>=b.p
    then x:=a.p
    else x:=b.p;
什么意思??

20 楼

15楼的:
你的程序怎么没有输入呀?

我来回复

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