热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

高精度算法(引用)

高精度算法(引用)在一般的科学计算中,会经常算到小数点后几百位或者更多,当然也可能是几千亿几百亿的大数字.一般这类数字我们统称为高精度数,高精度算法是用计算机对于超大数据的
高精度算法(引用)

  在一般的科学计算中,会经常算到小数点后几百位或者更多,当然也可能是几千亿几百亿的大数字.
  一般这类数字我们统称为高精度数,高精度算法是用计算机对于超大数据的一种模拟加,减,乘,除,乘方,阶乘,开方等运算.
  譬如一个很大的数字N >= 10^ 100, 很显然这样的数字无法在计算机中正常存储.
  于是, 我们想到了办法,将这个数字拆开,拆成一位一位的 或者是四位四位的存储到一个数组中, 用一个数组去表示一个数字.这样这个数字就被称谓是高精度数.
  对于高精度数,也要像平常数一样做加减乘除以及乘方的运算,于是就有了高精度算法:
  下面提供了Pascal的高精度加法, 高精度乘以单精度, 高精度乘以高精度的代码, 其他版本请各位大牛添加进来吧!
  Pascal代码如下(非完整); k为预定进制,加大进制以提高速度。
  Procedure HPule(a, b: Arr; Var c:Arr); //高精度加法
  Var
  i: Integer;
  Begin
  FillChar(c, SizeOf(c), 0);
  For i:= 1 To Maxn-1 Do Begin
  c[i]:= c[i] + a[i] + b[i];
  c[i + 1] := c[i] Div k;
  c[i] := c[i] Mod k;
  End;
  End;
  Procedure HPule(a: Arr; b:Integer; Var c:Arr); //高精度乘以单精度
  Var
  i: Integer;
  Begin
  FillChar(c, SizeOf(c), 0);
  For i:= 1 To Maxn-1 Do Begin
  c[i] := c[i] + a[i] * b;
  c[i+1]:= c[i] Div k;
  c[i]:= c[i] Mod k
  End;
  End;
  Procedure HPule(a, b: Arr; ; Var c:Arr); //高精度乘以高精度
  Var
  i, j: Integer;
  Begin
  FillChar(c, SizeOf(c), 0);
  For i:= 1 To Maxn Do
  For j := 1 To Maxn Begin
  c[i+j-1] := c[i+j-1] + a[i] * b[j];
  c[i+j]:= c[i+j-1] Div k;
  c[i+j-1]:= c[i+j-1] Mod k
  End;
  End;
  Ps:为了防止百度错误识别, 过程中有不少符号是全角状态输入.
  高精度加法
  var
  a,b,c:array[1..201] of 0..9;
  n:string;
  lena,lenb,lenc,i,x:integer;
  begin
  write('Input augend:'); readln(n);lena:=length(n);
  for i:=1 to lena do a[lena-i+1]:=ord(n)-ord('0');{加数放入a数组}
  write('Input addend:'); readln(n); lenb:=length(n);
  for i:=1 to lenb do b[lenb-i+1]:=ord(n)-ord('0');{被加数放入b数组}
  i:=1;
  while (i<=lena) or(i<=lenb) do
  begin
  x := a + b + x div 10; {两数相加,然后加前次进位}
  c := x mod 10; {保存第i位的值}
  i := i + 1
  end;
  if x>=10 {处理最高进位}
  then begin lenc:=i; c:=1 end
  else lenc:=i-1;
  for i:=lenc downto 1 do write(c); writeln {输出结果}
  end.
  高精度乘法(低对高)
  const max=100; n=20;
  var a:array[1..max]of 0..9;
  i,j,k;x:integer;
  begin
  k:=1; a[k]:=1;{a=1}
  for i:=2 to n do{a*2*3….*n}
  begin
  x:=0;{进位初始化}
  for j:=1 do k do{a=a*i}
  begin
  x:=x+a[j]*i; a[j]:=x mod 10;x:=x div 10
  end;
  while x>0 do {处理最高位的进位}
  begin
  k:=k+1;a[k]:=x mod 10;x:=x div 10
  end
  end;
  writeln;
  for i:=k dowento 1 write(a){输出a}
  end.
  高精度乘法(高对高)
  var a,b,c:array[1..200] of 0..9;
  n1,n2:string; lena,lenb,lenc,i,j,x:integer;
  begin
  write('Input multiplier:'); readln(n1);
  write('Input multiplicand:'); readln(n2);
  lena:=length(n1); lenb:=length(n2);
  for i:=1 to lena do a[lena-i+1]:=ord(n1)-ord('0');
  for i:=1 to lenb do b[lenb-i+1]:=ord(n2)-ord('0');
  for i:=1 to lena do
  begin
  x:=0;
  for j:=1 to lenb do{对乘数的每一位进行处理}
  begin
  x := a*b[j]+x div 10+c;{当前乘积+上次乘积进位+原数}
  c:=x mod 10;
  end;
  c:= x div 10;{进位}
  end;
  lenc:=i+j;
  while (c[lenc]=0) and (lenc>1) do dec(lenc); {最高位的0不输出}
  for i:=lenc downto 1 do write(c); writeln
  end.
  高精度除法
  fillchar(s,sizeof(s),0);{小数部分初始化}
  fillchar(posi,sizeof(posi),0); {小数值的位序列初始化}
  len←0;st←0; {小数部分的指针和循环节的首指针初始化}
  read(x,y);{读被除数和除数}
  write(x div y);{输出整数部分}
  x←x mod y;{计算x除以y的余数}
  if x=0 then exit;{若x除尽y,则成功退出}
  while len   begin
  inc(len);posi[x]←len;{记下当前位小数,计算下一位小数和余数}
  x←x*10; s[len]←x div y;x←x mod y;
  if posi[x]<>0 {若下一位余数先前出现过,则先前出现的位置为循环节的开始}
  then begin st←posi[x]; break;end;{then}
  if x=0 then break; {若除尽,则成功退出}
  end;{while}
  if len=0
  then begin writeln;exit;end;{若小数部分的位数为0,则成功退出;否则输出小数点}
  write('.');
  if st=0 {若无循环节,则输出小数部分,否则输出循环节前的小数和循环节}
  then for i←1 to len do write(s)
  else begin
  for i←1 to st-1 do write(s);
  write('(');
  for i←st to len do write(s);
  write(')');
  end;{else}


推荐阅读
  • CF:3D City Model(小思维)问题解析和代码实现
    本文通过解析CF:3D City Model问题,介绍了问题的背景和要求,并给出了相应的代码实现。该问题涉及到在一个矩形的网格上建造城市的情景,每个网格单元可以作为建筑的基础,建筑由多个立方体叠加而成。文章详细讲解了问题的解决思路,并给出了相应的代码实现供读者参考。 ... [详细]
  • 本文介绍了如何在给定的有序字符序列中插入新字符,并保持序列的有序性。通过示例代码演示了插入过程,以及插入后的字符序列。 ... [详细]
  • 猜字母游戏
    猜字母游戏猜字母游戏——设计数据结构猜字母游戏——设计程序结构猜字母游戏——实现字母生成方法猜字母游戏——实现字母检测方法猜字母游戏——实现主方法1猜字母游戏——设计数据结构1.1 ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • 前景:当UI一个查询条件为多项选择,或录入多个条件的时候,比如查询所有名称里面包含以下动态条件,需要模糊查询里面每一项时比如是这样一个数组条件:newstring[]{兴业银行, ... [详细]
  • 本文详细介绍了GetModuleFileName函数的用法,该函数可以用于获取当前模块所在的路径,方便进行文件操作和读取配置信息。文章通过示例代码和详细的解释,帮助读者理解和使用该函数。同时,还提供了相关的API函数声明和说明。 ... [详细]
  • 电话号码的字母组合解题思路和代码示例
    本文介绍了力扣题目《电话号码的字母组合》的解题思路和代码示例。通过使用哈希表和递归求解的方法,可以将给定的电话号码转换为对应的字母组合。详细的解题思路和代码示例可以帮助读者更好地理解和实现该题目。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • 本文介绍了Redis的基础数据结构string的应用场景,并以面试的形式进行问答讲解,帮助读者更好地理解和应用Redis。同时,描述了一位面试者的心理状态和面试官的行为。 ... [详细]
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • 动态规划算法的基本步骤及最长递增子序列问题详解
    本文详细介绍了动态规划算法的基本步骤,包括划分阶段、选择状态、决策和状态转移方程,并以最长递增子序列问题为例进行了详细解析。动态规划算法的有效性依赖于问题本身所具有的最优子结构性质和子问题重叠性质。通过将子问题的解保存在一个表中,在以后尽可能多地利用这些子问题的解,从而提高算法的效率。 ... [详细]
  • 本文介绍了UVALive6575题目Odd and Even Zeroes的解法,使用了数位dp和找规律的方法。阶乘的定义和性质被介绍,并给出了一些例子。其中,部分阶乘的尾零个数为奇数,部分为偶数。 ... [详细]
  • 本文介绍了南邮ctf-web的writeup,包括签到题和md5 collision。在CTF比赛和渗透测试中,可以通过查看源代码、代码注释、页面隐藏元素、超链接和HTTP响应头部来寻找flag或提示信息。利用PHP弱类型,可以发现md5('QNKCDZO')='0e830400451993494058024219903391'和md5('240610708')='0e462097431906509019562988736854'。 ... [详细]
author-avatar
Rockets马丁
这个家伙很懒,什么也没留下!
Tags | 热门标签
RankList | 热门文章
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有