高精度乘高精度
蓝桥杯算法提高 ADV-353 高精度乘法
code
#include <cstdio>
#include <cstring>
using namespace std;
const int N = 10005;
char str_a[N], str_b[N];
int a[N], b[N], c[N << 1];
int main() {
scanf("%s%s", str_a + 1, str_b + 1);
int len_a = strlen(str_a + 1), len_b = strlen(str_b + 1);
for (int i = 1; i <= len_a; ++i) {
a[len_a - i + 1] = str_a[i] - '0';
}
for (int i = 1; i <= len_b; ++i) {
b[len_b - i + 1] = str_b[i] - '0';
}
for (int i = 1; i <= len_a; ++i) {
for (int j = 1; j <= len_b; ++j) {
c[i + j - 1] += a[i] * b[j];
c[i + j] += c[i + j - 1] / 10;
c[i + j - 1] %= 10;
}
}
int len = len_a + len_b;
if (c[len] == 0) len--;
for (int i = len; i >= 1; --i) {
printf("%d", c[i]);
}
printf("\n");
return 0;
}
高精度乘高精度(压位)
测试题目 蓝桥杯 算法提高VIP 高精度乘法
code
#include <cstdio>
#include <cstring>
using namespace std;
const int N = 10005;
char str_a[N], str_b[N];
int a[N], b[N], c[N << 1];
int main() {
scanf("%s%s", str_a + 1, str_b + 1);
int len_str_a = strlen(str_a + 1), len_str_b = strlen(str_b + 1);
int tmp = 1;
int len_a = 0, len_b = 0;
for (int i = len_str_a; i >= 1; --i) {
if ((len_str_a - i) % 4 == 0) {
a[++len_a] = str_a[i] - '0';
tmp = 1;
} else {
a[len_a] += (str_a[i] - '0') * tmp;
}
tmp *= 10;
}
for (int i = len_str_b; i >= 1; --i) {
if ((len_str_b - i) % 4 == 0) {
b[++len_b] = str_b[i] - '0';
tmp = 1;
} else {
b[len_b] += (str_b[i] - '0') * tmp;
}
tmp *= 10;
}
for (int i = 1; i <= len_a; ++i) {
for (int j = 1; j <= len_b; ++j) {
c[i + j - 1] += a[i] * b[j];
c[i + j] += c[i + j - 1] / 10000;
c[i + j - 1] %= 10000;
}
}
int len = len_a + len_b;
if (c[len] == 0) len--;
for (int i = len; i >= 1; --i) {
printf(i == len ? "%d" : "%04d", c[i]);
}
printf("\n");
return 0;
}