高精度

高精度

高精度可以使用数组,字符串,向量都可完成,看个人习惯。

高精度其实就是一位一位的模拟运算,按照平常计算方法就可以算出来。

高精度加法

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
#include<iostream>

using namespace std;

const int N = 1e5 + 10;
int a[N], b[N];
void in(int *a)
{
string s;cin >> s;int len = s.size();
for(int i = len - 1;i + 1;i --) a[len - 1 - i] = s[i] - '0';
}

void solve()
{
in(a), in(b);
for(int i = 0;i < N;i ++)
{
a[i] += b[i];
a[i + 1] += (a[i] / 10);
a[i] %= 10;
}

int j = N - 1;
while(!a[j] && j - 1) j --;

while(j + 1) cout << a[j --];
}

int main()
{
solve();
return 0;
}

高精度减法

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
#include<iostream>

using namespace std;

const int N = 1e5 + 10;
int a[N], b[N];

void in(int *a)
{
string s;cin >> s;int len = s.size();
for(int i = len - 1;i + 1;i --) a[len - 1 - i] = s[i] - '0';
}

bool compare(int *a,int *b)
{
for(int i = N - 1;i + 1;i --)
{
if(a[i] > b[i]) return 0;
if(a[i] < b[i]) return 1;
}
return 0;
}

// 姑且认为a减b

void solve()
{
in(a), in(b);
if(compare(a,b)) cout << '-', swap(a,b);

for(int i = 0;i < N;i ++)
{
a[i] = a[i] + 10 - b[i];
a[i + 1] = a[i + 1] + a[i] / 10 - 1;
a[i] %= 10;
}


int j = N - 1;
while(j && !a[j]) j --;
while(j + 1) cout << a[j --];
}

int main()
{
solve();
return 0;
}

高精度乘法

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
#include<iostream>

using namespace std;

const int N = 1e5 + 10;
int a[N], b[N], ans[N * 2];

void in(int *a)
{
string s;cin >> s;int len = s.size();
for(int i = len - 1;i + 1;i --) a[len - i] = s[i] - '0';
}

// 高精乘高精,只需要注意一下结果和位数的关系,同时给出高精乘低精的写法
// 高低
void solve(int u)
{
in(a); int c; cin >> c;
for(int i = 0;i < N;i ++) a[i] *= c;

for(int i = 0;i < N;i ++)
{
a[i + 1] += a[i] / 10;
a[i] %= 10;
}

int j = N - 1;
while(j && !a[j]) j --;
while(j + 1) cout << a[j --];
}
// 高高 这里N开大了,会超时,注意题中的数值范围进行调整即可
void solve()
{
in(a), in(b);
for(int i = 1;i < N;i ++)
{
for(int j = 1;j < N;j ++)
{
ans[i + j - 1] += a[i] * b[j];
ans[i + j] = ans[i + j] + ans[i + j - 1] / 10;
ans[i + j - 1] %= 10;
}
}
int j = N - 1;
while(j - 1 && !ans[j]) j --;
while(j) cout << ans[j --];
}

int main()
{
solve();
return 0;
}

高精度除法

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
#include<iostream>

using namespace std;

const int N = 1e5 + 10;
int cot[N], ans[N], len, idx;

void divi(int b,int &r)
{
for(int i = len - 1;i + 1;i --)
{
r = r * 10 + cot[i];
ans[idx ++] = r / b;
r %= b;
}
}

void solve()
{
string s; int b = 0, r = 0;
cin >> s >> b;
for(int i = s.size() - 1; i + 1;i --) cot[len ++] = s[i] - '0';

divi(b, r);

for(int i = 0, j = 0;i + j < idx;i ++)
{
while(ans[j] == 0 && !i) j ++;

if(i + j < idx) cout << ans[i + j];
else cout << 0;
}

cout << endl << r << endl;

}

int main()
{
solve();
return 0;
}

高精度
http://example.com/2023/11/18/高精/
作者
smg
发布于
2023年11月18日
许可协议