多精度数带余除法_算法笔记 (一) 高精度
什么是高精度?
高精度算法(High Accuracy Algorithm)是处理大数字的数学计算方法。在一般的科学计算中,会经常算到小数点后几百位或者更多,当然也可能是几千亿几百亿的大数字。一般这类数字我们统称为高精度数,高精度算法是用计算机对于超大数据的一种模拟加,减,乘,除,乘方,阶乘,开方等运算。对于非常庞大的数字无法在计算机中正常存储,于是,将这个数字拆开,拆成一位一位的,或者是四位四位的存储到一个数组中, 用一个数组去表示一个数字,这样这个数字就被称为是高精度数。
本文将介绍四种常见的高精度计算,包括高精度加法、减法、高精度乘低精度、高精度除低精度。
1.高精度存储
我们使用数组来存储高精度数字,并且采用倒序的方法,如下图。
![](/assets/blank.gif)
逆序存储的原因:由于在后面的计算中常常涉及到进位,如果将高位放在数组第一位则会频繁的移动数字,造成时间复杂度的增加。
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.高精度乘低精度
高精度模拟乘法,每次乘法将计算高精度的每一位乘以低精度,并进位(所以就可能进位较多,加法中进位最多一位)
![](/assets/blank.gif)
#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+下一位,并且余上除数(相当于做减法)
![](/assets/blank.gif)
#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;
}
多精度数带余除法_算法笔记 (一) 高精度相关推荐
- 多精度数带余除法_《有余数的除法》教学设计
认识带余除法,是在学生已学过表内乘除法的基础上学习的.学生在前一阶段已经学会表内除法,接触过许多正好全部分完的事例,但二年级学生的思维还是以具体形象思维为主,想完成由形象思维向抽象逻辑思维的转变,就要 ...
- java 寻找和为定值的多个数_算法笔记_037:寻找和为定值的两个数(Java)
1 问题描述 输入一个整数数组和一个整数,在数组中查找两个数,满足他们的和正好是输入的那个整数.如果有多对数的和等于输入的整数,输出任意一对即可.例如,如果输入数组[1,2,4,5,7,11,15]和 ...
- c++ string 删除字符_算法笔记|(5)第二章C、C++的快速入门字符数组的存放方式string.h文件...
字符数组的存放方式 由于字符数组是由若干个char类型的元素组成的,因此字符数组的每一位都是一个char字符,除此之外,在一维字符数组或者二维字符数组的第二维的末尾都有一个空字符\0表示存放的字符串的 ...
- 函数传参数_算法笔记(7)第二章C、C++快速入门函数,main函数,
#includevoid change(int x){ x=x+1;}int main(){ int x=10; change(x); prinf("%d\n",x); retur ...
- java 完全背包问题算法_算法笔记(c++)--完全背包问题
算法笔记(c++)--完全背包和多重背包问题 完全背包 完全背包不同于01背包-完全背包里面的东西数量无限 假设现在有5种物品重量为5,4,3,2,1 价值为1,2,3,4,5 背包容量为10 #in ...
- 回溯 皇后 算法笔记_算法笔记_04_回溯
设计思想: (1)适用:求解搜索问题和优化问题. (2)搜索空间:数,节点对应部分解向量,可行解在树叶上. (3)搜索过程:采用系统的方法隐含遍历搜索树. (4)搜索策略:深度优先,宽度优先,函数优先 ...
- bzoj 1026: [SCOI2009]windy数 数位DP算法笔记
数位DP入门题之一 也是我所做的第一道数位DP题目 (其实很久以前就遇到过 感觉实现太难没写) 数位DP题目貌似多半是问从L到R内有多少个数满足某些限制条件 只要出题人不刻意去卡多一个$log$什么的 ...
- 主要成就和特殊贡献 java软件_算法笔记_212:第七届蓝桥杯软件类决赛真题(Java语言B组)...
前言:以下代码仅供参考,若有错误欢迎指正哦~ 1 愤怒小鸟 愤怒小鸟 X星球愤怒的小鸟喜欢撞火车! 一根平直的铁轨上两火车间相距1000米 两火车 (不妨称A和B) 以时速 10米/秒 相对行驶. 愤 ...
- java 二分图带权匹配_算法笔记_139:二分图的最大权匹配(Java)
packagecom.liuzhen.practice;importjava.util.Scanner;public classMain {public static int MAX = 100;pu ...
- mysql最小费用最大流问题_算法笔记_140:最小费用最大流问题(Java)
packagecom.liuzhen.practice;importjava.util.ArrayList;importjava.util.Scanner;public classMain {publ ...
最新文章
- 企业网站常用中英文对照表
- android 启动service报错,Android小经验
- arggis怎么修改上下标_京东自营是怎么操作的?有什么要求?
- Android平台和java平台 DES加密解密互通程序及其不能互通的原因
- pve安装黑群晖直通硬盘_PVE+lede+DSM网卡硬盘直通+win10
- 学习日报 7-10(验证码)
- cannot add new member解决方法
- 8.16 记忆增强神经网络:MANN、神经网络图灵机
- Linux系统Anaconda下载安装教程
- 牛顿插值法python代码_牛顿插值法——用Python进行数值计算
- Matlab窄带信号的测向算法
- cf----2019-08-07(Equalize Prices,Nearest Interesting Number, Candy Box (easy version))
- 优秀的流程图是如何制作的?简单的教程讲解
- C++STL之初识容器和迭代器
- 全国大学生智能汽车竞赛硬件篇(二)—电磁信号采集部分
- 计算机高级属性启用玻璃,“win键+tab键无法使用”的解决方案
- 收音机磁棒天线4根接法_有关收音机磁性天线和电路的小知识
- 网络基础(2)---子网划分、TCP/IP、DNS、DHCP
- C# 获取鼠标选中的文字(屏幕取词)
- Arcgis小技巧【4】——【空间连接】工具如何连接炸开的文字