小皇帝学算法--基础篇(2.2)

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;
}

  • 9
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值