【基础代码】高精{加.减.乘.除}

来源:互联网 发布:侠客风云传 mac 编辑:程序博客网 时间:2024/05/01 01:32

写了一下午的高精度,终于OK了...

===========================

加法

 -----------------

var  a,b,c:array[1..100000]of longint;  a_s,b_s,c_s:longint;procedure init;begin  assign(input,'jiafa.in');  assign(output,'jiafa.out');  reset(input); rewrite(output);end;procedure terminate;begin  close(input); close(output);  halt;end;function max(a,b:longint):longint;begin  if a>b then exit(a);  exit(b);end;procedure main;var  i:longint;  st_a,st_b:ansistring;begin  fillchar(a,sizeof(a),0);  fillchar(b,sizeof(b),0);  fillchar(c,sizeof(c),0);  readln(st_a);  readln(st_b);  a_s:=length(st_a);  b_s:=length(st_b);  for i:=1 to a_s do a[i]:=ord(st_a[a_s+1-i])-ord('0');  for i:=1 to b_s do b[i]:=ord(st_b[b_s+1-i])-ord('0');  c_s:=max(a_s,b_s);  for i:=1 to c_s do    begin      c[i+1]:=(a[i]+b[i]+c[i]) div 10;      c[i]:=(a[i]+b[i]+c[i]) mod 10;    end;    inc(c_s);    if c[c_s]=0 then dec(c_s);  //判断最高位是否为0  for i:=c_s downto 1 do write(c[i]);end;begin  init;  main;  terminate;end.


==========================

减法

-----------------

var  a,b,c:array[1..1000000]of longint;  a_s,b_s,c_s:longint;procedure init;begin  assign(input,'jianfa.in');  assign(output,'jianfa.out');  reset(input); rewrite(output);end;procedure terminate;begin  close(input); close(output);  halt;end;function max(a,b:longint):longint;begin  if a>b then exit(a);  exit(b);end;procedure main;var  i:longint;  st_a,st_b:ansistring;begin  fillchar(a,sizeof(a),0);  fillchar(b,sizeof(b),0);  fillchar(c,sizeof(c),0);  readln(st_a);  readln(st_b);  a_s:=length(st_a);  b_s:=length(st_b);  c_s:=max(a_s,b_s);  for i:=1 to a_s do a[i]:=ord(st_a[a_s+1-i])-ord('0');  for i:=1 to b_s do b[i]:=ord(st_b[b_s+1-i])-ord('0');  for i:=1 to c_s do    begin      c[i]:=a[i]-b[i];      if c[i]<0 then begin dec(a[i+1]); inc(c[i],10) end;      //若当前位减后小于0则...    end;  while (c[c_s]=0)and(c_s>=1) do dec(c_s);//注意了  //寻找最高位.{找到第一个不为0的}  for i:=c_s downto 1 do write(c[i]);end;begin  init;  main;  terminate;end.


=====================

高精乘高精

----------------

var  a,b,c:array[1..1000000]of longint;  a_s,b_s,c_s:longint;procedure init;begin  assign(input,'chengfa.in');  assign(output,'chengfa.out');  reset(input); rewrite(output);end;procedure terminate;begin  close(input); close(output);  halt;end;function max(a,b:longint):longint;begin  if a>b then exit(a);  exit(b);end;procedure main;var  i,j:longint;  st_a,st_b:ansistring;begin  readln(st_a);  readln(st_b);  a_s:=length(st_a);  b_s:=length(st_b);  c_s:=max(a_s,b_s);  for i:=1 to a_s do a[i]:=ord(st_a[a_s+1-i])-ord('0');  for i:=1 to b_s do b[i]:=ord(st_b[b_s+1-i])-ord('0');  for i:=1 to a_s do //因子2    for j:=1 to b_s do //因子1      c[i+j-1]:=c[i+j-1]+a[i]*b[j];  i:=1;  while (c[i]<>0)or(i<=c_s) do    begin      c[i+1]:=c[i+1]+c[i] div 10;      c[i]:=c[i] mod 10;      inc(i);    end;  c_s:=i-1;  //更新积的长度..  for i:=c_s downto 1 do write(c[i]);end;begin  init;  main;  terminate;end.


=====================

高精除高精

-------------------

var  a,b,c,d,f:array[1..100000]of longint;  st_a,st_b:ansistring;  a_s,b_s,c_s,d_s,f_s:longint;procedure init;begin  assign(input,'chufa.in');  assign(output,'chufa.out');  reset(input); rewrite(output);end;procedure terminate;begin  close(input); close(output);  halt;end;procedure chengfa;var  i:longint;begin  for i:=d_S downto 1 do d[i+1]:=d[i];  inc(d_S);  if d[d_s]=0 then dec(d_s); //这里要注意end;function compare:boolean;  //d/bvar  i:longint;begin  compare:=false;  if d_s>b_s then exit(true)  else  begin    if d_s=b_s then      begin        i:=b_s;        while (i>0)and(d[i]=b[i]) do dec(i);        if i=0 then exit(true)        else          begin            if d[i]>=b[i] then exit(true)                          else exit(false);          end;      end;  end;end;procedure jianfa; // d-b;var  i:longint;begin  fillchar(f,sizeof(f),0);  for i:=1 to d_s do    begin      f[i]:=d[i]-b[i];      if f[i]<0 then        begin          inc(f[i],10);          dec(d[i+1]);        end;    end;  f_S:=d_s;  while f[f_s]=0 do dec(f_s);  d_s:=f_s;  d:=f;end;procedure main;var  i:longint;begin  readln(st_a);  readln(st_b);  a_s:=length(st_a);  b_s:=length(st_b);  for i:=1 to a_s do a[i]:=ord(st_a[a_s+1-i])-48;  for i:=1 to b_s do b[i]:=ord(st_b[b_s+1-i])-48;  fillchar(c,sizeof(c),0);  //记录商  fillchar(d,sizeof(d),0);  d_s:=1;  for i:=a_s downto 1 do    begin      //上一步余数*10      chengfa;      d[1]:=a[i];      while compare do        begin          jianfa;          inc(c[i]);        end;    end;  c_s:=a_s;  while (c_s>1) and (c[c_s]=0) do dec(c_s);  for i:=c_s downto 1 do write(c[i]);end;begin  init;  main;  terminate;end.