ch0(简单实用算法篇)——高精度计算

发布时间:2024-12-12 14:40

使用金融计算器进行简单计算 #生活技巧# #财务管理技巧# #财经知识#

1.自然语言描述
高精度计算的算法都是模拟日常算术的做法,将平常列竖式计算的过程放在计算机上实现。高精度计算会极大地提高参与运算数的范围,摆脱限定字节长度数据类型的束缚。
vector不定长数组作运算时的数据结构。
高精度加法:设置一个局部变量保存当前数位运算的结果;向结果vector中保存mod10结果,后令变量整除10;迭代直至算完所有数位;注意最后若局部变量仍不为0(其实在计算中,这个局部变量不是0就是1,即进位要么没有,要么有)就说明最高数位产生进位,要再将1加入结果vector。
高精度减法:设置一个局部变量保存当前数位运算的结果;先让局部变量=被减数当前数位-局部变量(因为局部变量会保存低位的借位),然后局部变量减去减数当前数位;再将(局部变量+10)%10保存到结果vector中(向高位借1位);然后若局部变量>=0则说明没有像高位借位,局部变量设为0,反之则说明有借位,设为1。迭代完成后,要去除结果vector高位的0。注意,这里要求被减数>=减数。
高精度乘法:形式上,一个乘数为大数,另一个为数据类型可表示的数。每次将大乘数的数位与小乘数相乘,让进位变量加上这个结果,然后将mod10保存到结果vector中,整除10。(注意终止条件,乘法的进位可能会很大,所以在最高位运算结束后,进位变量不断通过mod10和整除10的操作使其为0),仍需要去掉高位多余的0。
高精度除法:形式上,被除数为大数,除数为数据类型可表示的数。与其他三则运算不同的是,这里需要从高位开始计算,与列竖式计算一致,不过最后要注意,当所有数位计算完后,余数会保留在中间变量里。计算完后要将结果vector反转一下(不反转不行,因为反转可以方便去掉高位的0)。

2.代码描述

题目:
Acwing.791 高精度加法题目链接
Acwing.792 高精度减法题目链接
Acwing.793 高精度乘法题目链接
Acwing.794 高精度除法题目链接

//高精度加法 #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <vector> using namespace std; vector<int> A,B; vector<int> add(vector<int> &A,vector<int> &B) { vector<int> res; int t=0; for(int i=0;i<A.size()||i<B.size();i++){ if(i<A.size())//vector数组未定义空间中是随机数 t+=A[i]; if(i<B.size()) t+=B[i]; res.push_back(t%10); t/=10; } if(t>0) res.push_back(1); return res; } int main(void) { string a,b; cin>>a>>b; for(int i=(int)a.length()-1;i>=0;i--) A.push_back(a[i]-'0'); for(int i=(int)b.length()-1;i>=0;i--) B.push_back(b[i]-'0'); auto C=add(A,B); for(int i=C.size()-1;i>=0;i--) cout<<C[i]; cout<<endl; return 0; } //----------------------------------------------------------------- //----------------------------------------------------------------- //高精度减法 #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <vector> using namespace std; vector<int> A,B; bool cmp(vector<int> &A,vector<int> &B) { if(A.size()!=B.size()) return A.size()>B.size();//位数比较 else{ for(int i=A.size()-1;i>=0;i--) if(A[i]!=B[i]) return A[i]>B[i];//位数相同时,从高位到低位依次比较 } return true;//A==B } vector<int> sub(vector<int> &A,vector<int> &B) { vector<int> res; int t=0; for(int i=0;i<A.size();i++){ t=A[i]-t; if(i<B.size()) t-=B[i]; res.push_back((t+10)%10); if(t>=0) t=0; else t=1; } while(res.size()>1&&res.back()==0) res.pop_back(); return res; } int main(void) { string a,b; cin>>a>>b; for(int i=(int)a.length()-1;i>=0;i--) A.push_back(a[i]-'0'); for(int i=(int)b.length()-1;i>=0;i--) B.push_back(b[i]-'0'); vector<int> C; if(cmp(A,B)){ C=sub(A,B); for(int i=C.size()-1;i>=0;i--) cout<<C[i]; cout<<endl; }else{ C=sub(B,A); cout<<'-'; for(int i=C.size()-1;i>=0;i--) cout<<C[i]; cout<<endl; } return 0; } //------------------------------------------------------------- //------------------------------------------------------------- //高精度乘法 #include <iostream> #include <cstring> #include <cstdio> #include <algorithm> #include <vector> using namespace std; vector<int> A; vector<int> mul(vector<int> &A,int b) { vector<int> res; int t=0; for(int i=0;i<A.size()||t;i++){ if(i<A.size()) t+=A[i]*b; res.push_back(t%10); t/=10; } while(res.size()>1&&res.back()==0) res.pop_back(); return res; } int main(void) { string a; int b; cin>>a>>b; for(int i=(int)a.length()-1;i>=0;i--) A.push_back(a[i]-'0'); auto C=mul(A,b); for(int i=C.size()-1;i>=0;i--) cout<<C[i]; cout<<endl; return 0; } //----------------------------------------------------------------- //----------------------------------------------------------------- //高精度除法 #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <vector> using namespace std; int r; vector<int> divide(vector<int> &A,int b) { vector<int> res; int t=0; for(int i=A.size()-1;i>=0;i--){ t=t*10+A[i]; res.push_back(t/b); t%=b; } r=t; reverse(res.begin(),res.end()); while(res.size()>1&&res.back()==0) res.pop_back(); return res; } int main(void) { string a; int b; cin>>a>>b; vector<int> X; for(int i=(int)a.length()-1;i>=0;i--) X.push_back(a[i]-'0'); auto C=divide(X,b); for(int i=C.size()-1;i>=0;i--) cout<<C[i]; cout<<endl; cout<<r; return 0; }

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235

网址:ch0(简单实用算法篇)——高精度计算 https://www.yuejiaxmz.com/news/view/453616

相关内容

计算机维护实习日记(精选10篇)
计算机学习心得体会(精选9篇)
计算机控制技术论文(精选5篇),计算机应用技术论文
计算机组装与维护实训总结范文(精选16篇)
坡度计算器
掌握收纳空间:精准计算收纳面积的实用方法(收纳面积计算方法图片)
分布式计算、统计学习与ADMM算法
Python实现简单算法乘法:提升编程效率与逻辑思维
计算机组装与维护实训报告(精选13篇)
算法人生(15):从“智能任务调度算法”到“15

随便看看