基础(二) 基础算法

第一章 高精度计算

题号 题目名称 通过数 提交数
1307 【例1.3】高精度乘法 32768 81860
1308 【例1.5】高精除 12920 26600
1309 【例1.6】回文数(Noip1999) 13237 31219
1168 大整数加法 44760 129166
1169 大整数减法 36974 65826
1170 计算2的N次方 24032 45146
1171 大整数的因子 13406 23107
1172 求10000以内n的阶乘 17783 53982
1173 阶乘和 14381 28718
1174 大整数乘法 20833 37762
1175 除以13 17900 30636

1307题解【例1.3】高精度乘法

笔记

最关键的就是C[i + j] = a[i] * b[j]

感觉上面的题目也不是每一道都需要我去做,反正我看到有人给了视频题解,如果自己能看懂的话,自己就做,看不懂的话就不做了.

感觉先把acwing的算法基础课看完才是最关键的.然后去看pat的测试,自己也参加一次.包括刷leetcode什么的.

要我说,还是先放着这部分.之后就算有时间做这部分,自己也不打算打卡,可能真的用不到了.

image-20241109131948543

打卡记录

1308题解

1309题解

1168题解大整数加法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#include <iostream>
#include <vector>

using namespace std;
const int N = 210;
vector<int> add(vector<int> &A, vector<int> &B);
int main(void)
{
string a, b;
cin >> a >> b;
vector<int> A, B;
for (int i = a.size() - 1; i >= 0; i--)
A.push_back(a[i] - '0');
for (int i = b.size() - 1; i >= 0; i--)
B.push_back(b[i] - '0');
auto C = add(A, B);
for (int i = C.size() - 1; i >= 0; i--)
printf("%d", C[i]);
return 0;
}
vector<int> add(vector<int> &A, vector<int> &B)
{
vector<int> C;
int t = 0;
for (int i = 0; i < A.size() || i < 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(1);

while (C.size() > 1 && C.back() == 0)
C.pop_back();
return C;
}

1169题解大整数减法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
#include <iostream>
#include <vector>
using namespace std;
const int N = 210;
bool cmp(vector<int> &A, vector<int> &B);
vector<int> sub(vector<int> &A, vector<int> &B);
int main(void)
{
string a, b;
cin >> a >> b;
vector<int> A, B;
for (int i = a.size() - 1; i >= 0; i--)
A.push_back(a[i] - '0');
for (int i = b.size() - 1; i >= 0; i--)
B.push_back(b[i] - '0');
if (cmp(A, B))
{
auto C = sub(A, B);
for (int i = C.size() - 1; i >= 0; i--)
printf("%d", C[i]);
}
else
{
auto C = sub(B, A);
printf("-");
for (int i = C.size() - 1; i >= 0; i--)
printf("%d", C[i]);
}
return 0;
}
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;
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;
}

1170题解

1171题解

1172题解

1173题解

1174题解大整数乘法

其余题目怎么感觉都不太会的样子,难道比acwing还难吗.既然感觉acwing里面没有教,那就直接在acking里面找视频题解学习

https://www.bilibili.com/video/BV1NW4y1m7Mp/?vd_source=d84f08a0531e04d6d41c38180cce9fb5&spm_id_from=333.788.videopod.episodes&p=10

这个博客是总结了能找到的资源帖,更加全面

https://blog.csdn.net/dllglvzhenfeng/article/details/134395667

1175题解