什么是高精度?

高精度算法High Accuracy Algorithm)是处理大数字的数学计算方法。在一般的科学计算中,会经常算到小数点后几百位或者更多,当然也可能是几千亿几百亿的大数字。一般这类数字我们统称为高精度数,高精度算法是用计算机对于超大数据的一种模拟加,减,乘,除,乘方,阶乘,开方等运算。对于非常庞大的数字无法在计算机中正常存储,于是,将这个数字拆开,拆成一位一位的,或者是四位四位的存储到一个数组中, 用一个数组去表示一个数字,这样这个数字就被称为是高精度数。

本文将介绍四种常见的高精度计算,包括高精度加法、减法、高精度乘低精度、高精度除低精度。

1.高精度存储

我们使用数组来存储高精度数字,并且采用倒序的方法,如下图。

在数组中逆序存储

逆序存储的原因:由于在后面的计算中常常涉及到进位,如果将高位放在数组第一位则会频繁的移动数字,造成时间复杂度的增加。

2.高精度加法

通过模拟人工加法的方式,逐个进位。

```
#include <iostream>
#include <vector>
#include <string>
using namespace std;
vector<int> add (vector<int> &A,vector<int> &B){if(A.size()<B.size()) return add(B,A);vector<int> C;int t = 0;for(int i = 0; i < A.size() ;i ++){t += A[i];if(i < B.size()) t+=B[i];C.push_back(t%10);t /= 10;}if(t) C.push_back(t);//最后的进位压入数组return C;
}
int main()
{string a,b;cin>>a>>b;vector<int> A, B;//个位放第一位for(int i = a.size() - 1;i >= 0;i --) A.push_back(a[i]-'0');for(int i = b.size() - 1;i >= 0;i --) B.push_back(b[i]-'0');auto C = add(A,B);for(int i = C.size()-1; i >=0 ; i--) printf("%d",C[i]);return 0;
}

3.高精度减法

通过模拟人工减法的方式,逐个相减。

#include <iostream>
#include <cstring>
#include <vector>
using namespace std;bool cmp(string a,string b){return a>=b;
}
bool cmp(vector<int> &A,vector<int> &B){if(A.size() != B.size()) return A.size() > B.size();for(int i=A.size()-1;i>=0;i--){if(A[i]!=B[i]) return A[i]>B[i];}return true;}//C = A - B, 满足A>=B ,A>= 0,B>=0
vector<int> sub(vector<int> &A,vector<int> &B){vector<int> C;for(int i = 0, t = 0; i<A.size() ; i++){t = A[i] - t;if(i < B.size()) t -= B[i];C.push_back((t+10)%10);if(t<0) t= 1;else t = 0;}
/*for(int i=0,t=0;i<A.size();++i){t+=A[i];if(i<B.size()) t-=B[i];C.push_back((t+10)%10);if(t>=0) t = 0;else t = -1;}
*/while(C.size()>1 && C.back() == 0) C.pop_back();return C;
}int main()
{string a,b;cin>>a>>b;vector<int>A,B;for(int i = a.size()-1; i >= 0 ; i --) A.push_back(a[i]-'0');for(int i = b.size()-1; i >= 0 ; i --) B.push_back(b[i]-'0');if(cmp(A,B)){//if(cmp(a,b)){ //! string比较有bugauto C = sub(A,B);for(int i=C.size()-1; i >=0 ; i --) printf("%d",C[i]);}else{auto C = sub(B,A);printf("-");for(int i=C.size()-1; i >=0 ; i --) printf("%d",C[i]);}return 0;
}

4.高精度乘低精度

高精度模拟乘法,每次乘法将计算高精度的每一位乘以低精度,并进位(所以就可能进位较多,加法中进位最多一位)

每次将大数字中的一位乘以小数字,进位累加
#include <iostream>
#include <cstring>
#include <vector>
using namespace std;//$高精度A乘低精度b乘法vector<int> mul(vector<int> &A,int b){vector<int> C;for(int i =0,t=0;i<A.size()|| t;++i ){if(i<A.size()) t+= A[i] *b;C.push_back(t%10);t/=10;}while(C.size()>1&&C.back()==0)C.pop_back();//去除前导0return C;
}int main()
{string a;int b;cin>>a>>b;vector<int> A;for(int i =a.size()-1;i>=0;i--) A.push_back(a[i]-'0');
//    for(int i =b.size()-1;i>=0;i--) B.push_back(b[i]-'0');auto C = mul(A,b);for(int i =C.size()-1;i>=0;i--) printf("%d",C[i]);return 0;
}

5.高精度除以低精度

高精度除法实现关键在于余数。(不知道哪些绘图软件好用...)

每一次迭代,余数乘10+下一位,并且余上除数(相当于做减法)

#include <iostream>
#include <cstring>
#include <vector>
#include <algorithm>
using namespace std;//$794. 高精度除法vector<int> div(vector<int> &A,int b,int &r){vector<int> C;r = 0;for(int i =A.size()-1,t=0;i>=0;i-- ){r = r*10+ A[i];C.push_back(r/b);r%=b;}reverse(C.begin(),C.end());while(C.size()>1&&C.back()==0)C.pop_back();return C;}int main()
{string a;int b;cin>>a>>b;vector<int> A;for(int i =a.size()-1;i>=0;i--) A.push_back(a[i]-'0');
//    for(int i =b.size()-1;i>=0;i--) B.push_back(b[i]-'0');int r;auto C = div(A,b,r);for(int i =C.size()-1;i>=0;i--) printf("%d",C[i]);printf("n%d",r);return 0;
}

多精度数带余除法_算法笔记 (一) 高精度相关推荐

  1. 多精度数带余除法_《有余数的除法》教学设计

    认识带余除法,是在学生已学过表内乘除法的基础上学习的.学生在前一阶段已经学会表内除法,接触过许多正好全部分完的事例,但二年级学生的思维还是以具体形象思维为主,想完成由形象思维向抽象逻辑思维的转变,就要 ...

  2. java 寻找和为定值的多个数_算法笔记_037:寻找和为定值的两个数(Java)

    1 问题描述 输入一个整数数组和一个整数,在数组中查找两个数,满足他们的和正好是输入的那个整数.如果有多对数的和等于输入的整数,输出任意一对即可.例如,如果输入数组[1,2,4,5,7,11,15]和 ...

  3. c++ string 删除字符_算法笔记|(5)第二章C、C++的快速入门字符数组的存放方式string.h文件...

    字符数组的存放方式 由于字符数组是由若干个char类型的元素组成的,因此字符数组的每一位都是一个char字符,除此之外,在一维字符数组或者二维字符数组的第二维的末尾都有一个空字符\0表示存放的字符串的 ...

  4. 函数传参数_算法笔记(7)第二章C、C++快速入门函数,main函数,

    #includevoid change(int x){ x=x+1;}int main(){ int x=10; change(x); prinf("%d\n",x); retur ...

  5. java 完全背包问题算法_算法笔记(c++)--完全背包问题

    算法笔记(c++)--完全背包和多重背包问题 完全背包 完全背包不同于01背包-完全背包里面的东西数量无限 假设现在有5种物品重量为5,4,3,2,1 价值为1,2,3,4,5 背包容量为10 #in ...

  6. 回溯 皇后 算法笔记_算法笔记_04_回溯

    设计思想: (1)适用:求解搜索问题和优化问题. (2)搜索空间:数,节点对应部分解向量,可行解在树叶上. (3)搜索过程:采用系统的方法隐含遍历搜索树. (4)搜索策略:深度优先,宽度优先,函数优先 ...

  7. bzoj 1026: [SCOI2009]windy数 数位DP算法笔记

    数位DP入门题之一 也是我所做的第一道数位DP题目 (其实很久以前就遇到过 感觉实现太难没写) 数位DP题目貌似多半是问从L到R内有多少个数满足某些限制条件 只要出题人不刻意去卡多一个$log$什么的 ...

  8. 主要成就和特殊贡献 java软件_算法笔记_212:第七届蓝桥杯软件类决赛真题(Java语言B组)...

    前言:以下代码仅供参考,若有错误欢迎指正哦~ 1 愤怒小鸟 愤怒小鸟 X星球愤怒的小鸟喜欢撞火车! 一根平直的铁轨上两火车间相距1000米 两火车 (不妨称A和B) 以时速 10米/秒 相对行驶. 愤 ...

  9. java 二分图带权匹配_算法笔记_139:二分图的最大权匹配(Java)

    packagecom.liuzhen.practice;importjava.util.Scanner;public classMain {public static int MAX = 100;pu ...

  10. mysql最小费用最大流问题_算法笔记_140:最小费用最大流问题(Java)

    packagecom.liuzhen.practice;importjava.util.ArrayList;importjava.util.Scanner;public classMain {publ ...

最新文章

  1. 20分钟一键自动化部署10台集群规模实战(隆重分享)
  2. Jupyter Notebook 基本使用
  3. 使用码云git的webhook实现生产环境代码的自动pull
  4. Hihocoder #1631 : Cats and Fish 模拟
  5. C++/C--字符串分割函数 --strtok()
  6. java键盘输入一个数_Java如何实现从键盘输入一个数?
  7. 安装Nagios监控软件
  8. mysql cluster error 4010 157_关于mysql-cluster的一些问题想讨教各位经验人事
  9. windows筛选键
  10. linux下自动更换壁纸软件,适用于Ubuntu 18.04的4款最佳壁纸自动切换软件
  11. 超高分辨率大屏拼接工作站硬件选型
  12. PBR流程介绍和模型规范
  13. python numpy 图片 pad 参数详解
  14. 有关程序员的几则冷笑话
  15. on后面使用and和where的区别
  16. xshell进入桌面_xshell中启动linux图形界面
  17. libed2k源码导读:(二)Session接口以及实现分析
  18. jQuery之属性操作
  19. 一种ESP8266使用MQTT连接阿里云和云Web方法
  20. 做网站windows和linux哪个好,做网站永Linux系统服务器到底有什么优势?

热门文章

  1. 灰度图像加性噪声污染和运动模糊图像复原
  2. SQL Server2005如何进行数据库定期备份
  3. Android考察报告模板,《跨越星弧》星球地质考察报告首次公开!
  4. lua反射的一个例子
  5. php有的图片显示不出来,图片显示不出来,但是数据库里有显示
  6. NPM ---- 配置淘宝镜像CNPM
  7. 微信支付 ---- (商户号该产品权限处罚中)
  8. linux夸分区软连接的作用,Linux 硬连接和软连接的原理 (in使用)
  9. 【转】C#实现SqlServer数据库的备份和还原
  10. 记录mysql常用语句