zoukankan      html  css  js  c++  java
  • 高精度模板

    pascal模板

    字符串转数组

    procedure change(var s:ansistring; var a:arraytype; var a1:longint);
    var
      t:longint;
    begin
      t:=length(s);
      for i:=t downto 1 do
      val(s[i],a[t-i+1]);
      a1:=t;
    end;

          这段一般来说用处不大,但是初学时的一些程序常用的。

    高精加法

    procedure c1(var a,b,c:arraytype; var a1,b1,c1:longint);
    var
      i,j,k,x:longint;
    begin
      i:=1; x:=0;
      while (i<=a1)or(i<=b1) do
      begin
        c[i]:=a[i]+b[i]+x;
        x:=c[i] div modnum;
        c[i]:=c[i] mod modnum;
        inc(i);
      end;
      if x>0 then begin
        c1:=i;
        c[i]:=x;
      end
      else c1:=i-1;
    end;

          数组的加法应用范围还是比较广的,比如数列的迭代,就像斐波那契数列一样,还有在应用过程中,如果是迭代的话,两个数组就够了,c1(x1,x2,x1,l1,l2,l1) 即可简单完成迭代。

    高精减法

    procedure c2(var a,b:arraytype; var a1,b1:longint);
    var
      i,j,k,x:longint;
    begin
      i:=1; x:=0;
      while i<=b1 do
      begin
        if a[i]<b[i] then
        begin
          a[i]:=a[i]+modnum-b[i];
          dec(a[i+1]);
        end
        else a[i]:=a[i]-b[i];
        inc(i);
      end;
      while a[i]=0 do dec(i);
      a1:=i;
    end;

    高精减法倒是不常用,不过,熟练了之后也可以轻松打出来的。

    高精乘法 

    procedure c3(var a,b,c:arraytype; var a1,b1,c1:longint);
    var
      i,j,k,x:longint;
    begin
      for i:=1 to a1 do
      begin
        x:=0;
        for j:=1 to b1 do
        begin
          c[i+j-1]:=a[i]*b[j]+x+c[i+j-1];
          x:=c[i+j-1] div modnum;
          c[i+j-1]:=c[i+j-1] mod modnum;
        end;
        c[i+j]:=c[i+j]+x;
      end;
      c1:=a1+b1;
      while (c1>1)and(c[c1]=0) do
      dec(c1);
    end;

           乘法最后要略略注意的是while (c1>1)and(c[c1]=0) do dec(c1);

          一开始我总喜欢打成if语句,往往都会导致错误,切记切记

     高精除单精

    procedure c4(var a:arraytype; var a1,k:longint);
    var
      i,j,x:longint;
    begin
      x:=0;
      for i:=a1 downto 1 do
      begin
        a[i]:=a[i]+x*modnum;
        x:=a[i] mod k;
        a[i]:=a[i] div k;
      end;
      while (a1>1)and(a[a1]=0) do dec(a1);
    end;

    高精乘单精 

    procedure cc(var a:arraytype; var a1:longint; k:longint);
    var
      i,j,x:longint;
    begin
      x:=0;
      for i:=1 to a1 do
      begin
        a[i]:=a[i]*k+x;
        x:=a[i] div modnum;
        a[i]:=a[i] mod modnum;
      end;
      while x>0 do
      begin
        inc(a1);
        a[a1]:=x mod modnum;
        x:=x div modnum;
      end;
    end;

          两个高精度数的运算还是不多的,主要还是高精和单精的组合灵活性比较大,比如在组合数学中的应用,或是算阶乘之类的还是很常见的。

    高精度的压位

           压位是高精度中的常用技巧,在数据规模相对比较大的情况下,压位的高精度往往有更强的应用能力,比较快的是longint压位4位,int64压位八位,如果没有复数,用dword和qword算的更快一些,

          其实压位非常简单,只要将modnum设为10000 就是了,最后输出时字符串处理一下即可:

    write(x1[l1]);
      for i:=l1-1 downto 1 do
      begin
        str(x1[i],s);
        while length(s)<4 do s:='0'+s;
        write(s);
      end;

           总之呢,高精度还是简单的,这只是一种工具,但是,细节该注意的还是必须得注意……

    愿你出走半生,归来仍是少年

  • 相关阅读:
    导入excel表格的数据--->到mysql中
    git 恢复丢失的文件-- 不提交入口文件
    putty 中使用git
    mysql 登录中用户管理
    putty 窗口管理
    navicat导出表结构-->导入powerdesigner
    mysql导出数据表结构,必须退出mysql命令.重新使用msyqldump命令
    服务器上死活不执行新增的代码-----你需要清除程序缓存了
    把json数据 [ { } ] 转为数组
    从尾到头打印链表
  • 原文地址:https://www.cnblogs.com/forever97/p/3426569.html
Copyright © 2011-2022 走看看