1.高精度乘法
相对简单:C = A * b(高精度整数*低精度整数),与手算的方式不同的是不用把b拆开算,是A的每一位乘完整的b再加上进位。
注意:计算所得到的本位为t%10,进位为t/10.
#include <iostream>
#include <vector>
using namespace std;
//C = A * b(A为大数,b为小的数)
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;
}
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');
auto C = mul(A, b);
for (int i = C.size() - 1; i >= 0; i--)
printf("%d", C[i]);
return 0;
}
2.高精度除法
注意:1.为了与之前的存储方式统一,依然是倒着存的。e.g.a = 12345-->[5,4,3,2,1]
2.但计算是与之前的从低位开始算不同,高精度除法是从高位开始算的,与正常手算时候的过程呈镜像效果,不影响结果
3.所以最后C的结果需要用reverse翻转一下才是最终正确的结果
啊瓦达西是小天才,这个图是不是很像个爱心啊哈哈哈
#include <iostream>
#include <vector>
#include <algorithm>//用于 reverse 函数
using namespace std;
//C = A / b(A为大数,b为小的数)
vector<int> div(vector<int> &A, int b, int &r) {
vector<int> C;
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;
}
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');
int r;
auto C = div(A, b, r);
for (int i = C.size() - 1; i >= 0; i--)
printf("%d", C[i]);
return 0;
}
3.前缀和
Si = a1 + a2 +...+ai
一般下标从1开始,边界定义为S0 = 0
区间【l,r】的前缀和计算公式:Sr - S(l-1)
#include <iostream>
using namespace std;
const int N = 100010;
int n, m;
int a[N], s[N];
int main() {
scanf("%d%d", &n, &m);
for (int i = 1; i <= n; i++)
scanf("%d", &a[i]);
for (int i = 1; i <= n; i++)
s[i] = s[i - 1] + a[i]; //前缀和的初始化
while (m--) {
int l, r;
scanf("%d%d", &l, &r);
printf("%d\n", s[r] - s[l - 1]); //区间的计算
}
return 0;
}