高精度加法的优化

改善高精度运算的效率

•以上接触到的高精度存储方法是用一个整型数组来表示一个很大的数,数组中的每一个数表示一位十进制数字。但这种方法的缺点是,如果十进制数的位数很多,则对应数组的长度会很长,并增加了高精度计算的时间。那么有什么方法可以改善高精度运算的效率呢?

•我们可以考虑用一个数记录2位数字、3位数字或更多位数字。理论上来说,数组中的每个数表示的数字越多,数组的长度就越短,程序运行的时间也就越短。但是,我们还需考虑到计算机中的一个数的取值范围,必须保证它们在运算过程中不会越界。在权衡了两方面的情况后得出:如果只有加减法运算,那么可以用一个longint记录9位数字(十亿进制),如果有加减乘除运算,那么用一个longint记录4位数字(万进制)是最佳方案。我们以万进制为例,来看一下优化的方法:

 1 var
 2  s1,s2:string;
 3 procedure plus(s1,s2:string);
 4 var
 5  a,b,c:array[1..500]of longint;
 6  i,j1,j2,l,k,p,code:longint;
 7 begin
 8  fillchar(a,sizeof(a),0);
 9  fillchar(b,sizeof(b),0);
10  fillchar(c,sizeof(c),0);
11  j1:=0; l:=length(s1);
12  while l>0 do
13  begin
14   inc(j1);
15   val(copy(s1,l-3,4),a[j1],code);
16   s1:=copy(s1,1,l-4); l:=length(s1);
17  end;
18  j2:=0; l:=length(s2);
19  while l>0 do
20  begin
21   inc(j2);
22   val(copy(s2,l-3,4),b[j2],code);
23   s2:=copy(s2,1,l-4); l:=length(s2);
24  end;
25  if j1>j2 then p:=j1 else p:=j2;
26  k:=0;
27 for i:=1 to p do
28  begin
29   c[i]:=a[i]+b[i]+k;
30   k:=c[i] div 10000;
31   c[i]:=c[i] mod 10000;
32  end;
33  if k=1 then
34  begin
35   inc(p); inc(c[p]);
36  end;
37  write(c[p]);
38  for i:=p-1 downto 1 do
39  begin
40   if c[i]<10 then write(‘000‘,c[i]) else
41   if c[i]<100 then write(‘00‘,c[i]) else
42   if c[i]<1000 then write(‘0‘,c[i]) else
43   write(c[i]);
44  end;
45  writeln;
46 end;
47 begin
48  readln(s1);
49  readln(s2);
50  plus(s1,s2);
51 end.
时间: 2024-08-09 11:19:33

高精度加法的优化的相关文章

4.n的高精度阶乘---优化

题目:对于每组测试数据,在一行中给出一非负整数n(n小于等于100) 样例输入 3 5 10 样例输出 6 120 3628800 超时的代码如下:#include <iostream>#include <cstring>using namespace std; int main(){    int n, count = 0;    int a[100] = {1};    cin >> n;    if(n == 0){        cout << 1;

高精度乘法程序

对于超过20位的数的乘法问题,我们无法使用普通的方法!!!即使是longlong也会超出范围的!像这样的数,我们只能使用高精度的知识利用数组的方法解决问题!对于高精度乘法的问题,其实思路和高精度加法的思路差不多,都需要使用字符数组来存放每次算完的结果!        1  2  3        *4  5  6    ________________      12  15  18   8  10  124  5   6  _____________________4 13   28   27

XDOJ_1003_高精度+进制

http://acm.xidian.edu.cn/problem.php?id=1003 类似高精度加法的模版,模拟一下即可. #include<iostream> #include<cstring> #include<cstdio> #include<algorithm> using namespace std; int change1(char a) { switch(a) { case 'A':return 10; case 'B':return 11

高精度浮点数运算

/* Name: 高精度浮点数运算 Copyright: Author: 巧若拙 Date: 08-11-14 10:17 Description: 本程序实现了高精度浮点数的加法,减法,乘法,乘方和除法运算,有效数字精确到MAX. 为了便于进位,本程序采用了较为独特的数据结构,即把浮点数分成整数和小数部分,分别存储在两个不同的数组中. 其中整数部分数字存储在ValInt[MAX-lenInt...MAX) ,小数部分数字存储在ValDec[1...lenDec],ValDec[0]用来存储进位

用c++实现高精度加法

c++实习高精度加法 最近遇到一个c++实现高精度加法的问题,高精度问题往往十复杂但发现其中的规律后发现并没有那么复杂,这里我实现了一个整数的高精度加法,主要需要注意以下几点: 1:将所需输入的数据以字符数组的形式输入,建立字符数组,建立相应的整数数组,然后一一映射,以此来实现数据的输入,需要注意的是,当实现字符向数字映射时,应该减去相应的ASCII偏移值,即48. 2:为了模拟我们在纸上手算的进位模拟运算,我们将字符数组反向填入整数数组,上图的后几行代码实现了这个操作. 3:实现进位加法,这是

算法竞赛之高精度以及部分组合的入门讲解

在算法竞赛之中,有时候一些题目的意思很容易就可以看出来解决步骤,但是数据却不是平常的数据量,而是高精度数据,这时候要是因为高精度的问题而使得这道题失去了AC的机会岂不是会被队友喷死,所以今天就教教大学关于高精度的一些算法吧. 个人对于高精度的算法,感觉就是很原始的小时候学习加减乘除时候的做法.怎么说呢,当然是一位一位进行处理的,可能乘法有一些什么快速乘法的,这个等后面再进行讲解,现在就说说平常自己针对高精度是怎么进行处理的吧. 首先呢,因为是高精度,那么数字的范围不大可能是int乃至__int6

用C++实现高精度加法运算

先说说高精度运算的概念: 是指参与运算的数(加数,减数,因子--)范围大大超出了标准数据类型(整型,实型)能表示的范围的运算.例如,求两个200位的数的和.这时,就要用到高精度算法了.(摘自百度百科). 再往下看之前,大家先列竖式计算35+86. 注意的问题: (1)运算顺序:两个数靠右对齐:从低位向高位运算:先计算低位再计算高位: (2)运算规则:同一位的两个数相加,然后再加上从低位来的进位,成为该位的和: 这个和再去掉向高位的进位就成为该位的值:如上例:3+8+1=12,向前一位进1,本位的

编译器的优化

编译器使用的优化技巧 a.1.  变量优化        b.加法的优化 变量+变量 = lea reg32,[变量+变量] 变量+变量 = add eax,xx          变量+常量 = add 变量+常量          变量+1    = inc 变量      b.减法的优化 变量-变量 = lea reg32,[变量-变量] 变量-变量 = sub xx,xx          变量-常量 = add 变量+补码(常量)          变量-1    = dec 变量 c

NOIP1999普及组解题报告

不知怎么地,洛谷的noip1999普及组的题和以前考的不一样 /雾 回文数 分析:一道高精度加法的模拟题,注意还有16进制. #include<iostream> #include<algorithm> #include<cstring> #include<cmath> using namespace std; const int maxn=150; int n,len=0,a[maxn]; char s[maxn]; bool is_h(){ for(in