标签:10 高精度 int back vector push size
高精度加法
读入数据时,四种运算均从个位数开始push_back,输出时从vector最高位开始。
需要取尾0:
减(高位可能被减为0)、乘(乘以0后全为0)、除(得到的结果高位可能为0)
vector<int> add(vector<int> a, vector<int> b) { vector<int> c; int t = 0; for(int i = 0; i < max(a.size(), b.size()); i++) { if(i < a.size()) 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; }
高精度减法
如果当前这一位计算后,t < 0,令t = 1借一位,否则表示没有借位,令t = 0
push_back一个正数,即(t + 10) % 10;
vector<int> sub(vector<int> a, vector<int> b) { vector<int> c; int t = 0; for(int i = 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; } while(c.size() > 1 && c.back() == 0) c.pop_back(); return c; }
高精度乘法
t最好在for里面做完,如果写成if(t) c.push_back(t);
在连乘时会出问题。
b太大,t需要开long long
vector<int> mul(vector<int> a, int b) { vector<int> c; int t = 0; for(int i = 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(); return c; }
vector<int> mul(vector<int> a, vector<int> b) { vector<int> c(a.size() + b.size() + 10); for(int i = 0; i < a.size(); i++) for(int j = 0; j < b.size(); j++) c[i + j] += a[i] * b[j]; for(int i = 0; i < c.size(); i++) c[i + 1] += c[i] / 10, c[i] %= 10; while(c.size() > 1 && c.back() == 0) c.pop_back(); return c; }
高精度除法
注意除数的大小,如果 > 1e9,r需要开long long
vector<int> div(vector<int> a, int b) { vector<int> c; long long r = 0; for(int i = a.size() - 1; 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; }
标签:10,高精度,int,back,vector,push,size 来源: https://www.cnblogs.com/9r2pqvv88/p/16425785.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。