高精度模板

模板

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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;
}



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
void reverse(int len, int num) {
for (int i = 0; i < len; i++) { //把'1'换成1
s1[i] = s1[i] - '0';
}

int i = 0, j = len - 1; //将s1反过来
while(i < j) {
int t = s1[i];
s1[i] = s1[j];
s1[j] = t;
i++, j--;
}

for (i = 0; i < len; i++) { //从低位开始乘,每一位都乘上num
int t = s1[i] * num + a[i]; //加a[i]是因为前一有进位的话,a[i]不为0
a[i] = t % 10;
a[i + 1] += t / 10; //进位
}

while (!a[i]) i--; //去掉前导0

if(i < 0) printf("0"); //答案为0,前导0就全部去掉了,i=-1
for ( ; i >= 0; i--) printf("%d", a[i]); //从高位输出
puts("");
}



题目描述:

给定两个非负整数(不含前导 0) A 和 B,请你计算 A×B 的值。

输入格式
共两行,第一行包含整数 A,第二行包含整数 B。

输出格式
共一行,包含 A×B 的值。

数据范围

1≤A的长度≤100000,
0≤B≤10000

输入样例:

2
3

输出样例:

26


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

using namespace std;

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




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
#include<stdio.h>
#include<string.h>
#define N 100010

char s1[N];
char s2[10];
int a[N];

void reverse(int len, int num) {
for (int i = 0; i < len; i++) { //把'1'换成1
s1[i] = s1[i] - '0';
}

int i = 0, j = len - 1; //将s1反过来
while(i < j) {
int t = s1[i];
s1[i] = s1[j];
s1[j] = t;
i++, j--;
}

for (i = 0; i < len; i++) { //从低位开始乘,每一位都乘上num
int t = s1[i] * num + a[i]; //加a[i]是因为前一有进位的话,a[i]不为0
a[i] = t % 10;
a[i + 1] += t / 10; //进位
}

while (!a[i]) i--; //去掉前导0

if(i < 0) printf("0"); //答案为0,前导0就全部去掉了,i=-1
for ( ; i >= 0; i--) printf("%d", a[i]); //从高位输出
puts("");
}

int main() {
scanf("%s%s", s1, s2);

int len1 = strlen(s1);
int len2 = strlen(s2);

int num = 0;
for (int i = 0; i < len2; i++) { //把第二个数转成int
num = num * 10 + (s2[i] - '0');
}

reverse(len1, num);

return 0;
}