5.6
继续打卡模板题;
高精度加法
-
主要思想:
-
我们人都是从个位依次往高位算,同理,这里从个位开始,然后通过一个借记点进行进位;
-
#include "bits/stdc++.h" using namespace std; string a, b; vector<int> sum(vector<int>& a, vector<int>& b) { vector<int> res; if (a.size() < b.size()) return sum(b, a); int t = 0; //借记进位; for (int i = 0; i < a.size(); i++) { t = a[i] + t;//每次必先加a位置的数 if (i < b.size()) t += b[i];//如果b存在的话,加上b位置的数; res.push_back(t % 10);//每次只存一个位置; t /= 10; } if (t) res.push_back(1);//如果最高位上还有进位需要再将加上1; return res; } int main() { cin >> a >> b; vector<int> c, d; vector<int> res; for (int i = a.size() - 1; i >= 0; i--) { c.push_back(a[i] - '0'); } for (int i = b.size(); i >= 0; i--) { c.push_back(b[i] - '0'); } res = sum(c, d); for (int i = res.size() - 1; i >= 0; i--) { cout << res[i]; } return 0; }
高精度减法:
-
主要思想:其实同理,也是从个位进行相减;
-
通过借记点进行保存移位;
-
相减储存的时候,采用先将(小数+10)%10。这样能够将相减出来的数两种情况变成一种;
-
#include "bits/stdc++.h" using namespace std; 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; } 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; //这里很容易错,一定要写成a[i]-t而不是t //-=a[i]这个是t-a[i];结果是不一样的 if (i < B.size()) t -= B[i]; C.push_back((t + 10) % 10); //这里是将两次情况进行了合并,t>=0和t<0;的情况压入 if (t < 0) //说明有借记; t = 1; else //说明无借记 t = 0; } while (C.size() > 1 && C.back() == 0) C.pop_back(); return C; } int main() { string a, b; vector<int> c, d; cin >> a >> b; for (int i = a.size() - 1; i >= 0; i--) { c.push_back(a[i] - '0'); } for (int i = b.size() - 1; i >= 0; i--) { d.push_back(b[i] - '0'); } vector<int> res; if (cmp(c, d)) res = sub(c, d); else res = sub(d, c), cout << "-"; for (int i = res.size() - 1; i >= 0; i--) { cout << res[i]; } return 0; }
高精度乘法
-
主要思想
-
每次都将高精度的从个位开始的数进行乘以低精度数;
-
存储数的时候,先取模10计算结果值,后面再除10,得到进位的值;
-
#include "bits/stdc++.h" using namespace std; vector<int> mul(vector<int>& a, int b) { vector<int> res; int t = 0; for (int i = 0; i < a.size() || t; i++) { //t是为什么,t是每次进位不为0的情况 if (i < a.size()) //只有在a有位置的时候,才能进行乘法运算 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() { string a; int b; cin >> a >> b; vector<int> v, res; for (int i = a.size() - 1; i >= 0; i--) { v.push_back(a[i] - '0'); } res = mul(v, b); for (int i = res.size() - 1; i >= 0; i--) { cout << res[i]; } }
高精度除法
-
主要思想
-
还是需要用进位处理除下来的余数;
-
这里需要三个参数,高精度数,除数,余数;
-
而且除法是只能从高位进行开始除的,这样就需要进位先除以除数,然后再对除数取模,得到下一次的余数
-
#include "bits/stdc++.h" using namespace std; vector<int> div(vector<int> a, int b, int& r) { // a是原来的vector数组;b是除数;r是余数; vector<int> res; //这个结果是商; r = 0; for (int i = a.size() - 1; i >= 0; i--) { //因为是除法,只能是从高到低开始除,所以,i是从a.size开始; r = r * 10 + a[i]; //每次用余数乘上10加上向量中的每一个个数; res.push_back(r / b); r %= b; //每次还要除模:这样记吧。因为除模肯定是能得到最后的最小的余数的。 } reverse(res.begin(), res.end()); while (res.size() > 1 && res.back() == 0) { res.pop_back(); } return res; } int main() { string a; int b; cin >> a >> b; vector<int> v; for (int i = a.size() - 1; i >= 0; i--) { v.push_back(a[i] - '0'); } int r; vector<int> res; res = div(v, b, r); for (int i = res.size() - 1; i >= 0; i--) { cout << res[i]; } cout << endl << r; return 0; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)