什么是高精度?

高精度算法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. 企业网站常用中英文对照表
  2. android 启动service报错,Android小经验
  3. arggis怎么修改上下标_京东自营是怎么操作的?有什么要求?
  4. Android平台和java平台 DES加密解密互通程序及其不能互通的原因
  5. pve安装黑群晖直通硬盘_PVE+lede+DSM网卡硬盘直通+win10
  6. 学习日报 7-10(验证码)
  7. cannot add new member解决方法
  8. 8.16 记忆增强神经网络:MANN、神经网络图灵机
  9. Linux系统Anaconda下载安装教程
  10. 牛顿插值法python代码_牛顿插值法——用Python进行数值计算
  11. Matlab窄带信号的测向算法
  12. cf----2019-08-07(Equalize Prices,Nearest Interesting Number, Candy Box (easy version))
  13. 优秀的流程图是如何制作的?简单的教程讲解
  14. C++STL之初识容器和迭代器
  15. 全国大学生智能汽车竞赛硬件篇(二)—电磁信号采集部分
  16. 计算机高级属性启用玻璃,“win键+tab键无法使用”的解决方案
  17. 收音机磁棒天线4根接法_有关收音机磁性天线和电路的小知识
  18. 网络基础(2)---子网划分、TCP/IP、DNS、DHCP
  19. C# 获取鼠标选中的文字(屏幕取词)
  20. Arcgis小技巧【4】——【空间连接】工具如何连接炸开的文字

热门文章

  1. 附上一张公司项目解决方案的工程图
  2. WSS 3.0与MOSS 2007重要更新
  3. 【RPC】远程过程调用
  4. SVN打开HTML文件,tortoisesvn安装后怎么打开
  5. jQuery简单好用的JavaScript代码库略解使用
  6. 对文档的编辑过多_Wizard 开源文档管理系统1.0发布啦
  7. mybatis数据输入
  8. WPF-创建超链接文本
  9. centos7 yum安装zabbix监控
  10. 解决 应用程序无法启动(0xc000007b),请单击确定关闭应用程序