//高精度算法-乘法-(1) 大整数 x 整数
#include <iostream>
#include <string>
#include<cstring>
using namespace std;
char s1[200]; // 大精度数存储
int a[260] = { 0 }, b, c[261] = {0}; // b为整数 int 型
int main()
{
cin >> s1 >> b; // 输入大精度数 与 整数
if (b == 0) {
cout << 0; // 乘数出现0 结果为0
}
else {
int slen = strlen(s1); // 获取s1的长度 它的头文件是cstring
if (b < 0) { // 如果是负整数 那么需要添加一个'-'
cout << '-';
b *= -1; // 换成正整数
}
for (int i = 0; i < slen; i++) {
a[i] = s1[slen - 1 - i] - '0';
} // 转存到数组里,但注意,这是倒着存的,即 个十百千万....
for (int k = 0; k < slen; k++) {
c[k] += a[k] * b; //先获取到某位 乘以 整数的结果
if (c[k] >= 10) { // 如果结果超过10要进位
c[k + 1] += c[k] / 10; // 算出需要进位的数,因为我们数组的每位都只能存储0-9
c[k] = c[k] % 10; // c[k]真实应该表示的数
}
}
if (c[slen]) slen++; // 单独检测最高位是否产生了进位 如果是,则++
for (int i = 0; i < slen; i++) {
cout << c[slen - 1 - i]; // 打印输出
}
}
return 0;
}
大精度 x 整数 相对而言不需要太多道理,只需要简单的做乘法 进位
大精度 x 大精度 则需要通过双for循环来计算c值 代码如下:
//高精度算法-乘法-(2) 大整数 x 大整数
#include <iostream>
#include <string>
#include<cstring>
using namespace std;
char s1[200], s2[200]; // 大精度数存储 与乘法(1)的区别是要存储2个大整数
int a[200], b[200], c[410]; //把字符串转化之后存储的位置 a,b为大字符串转化结果
// c为计算结果
void z_int(char a[], int b[]) { //这个函数2个参数
int len = strlen(a); // 获取传入的char组的长度
for (int i = 0; i < len; i++) {
b[i] = a[len - i - 1] - '0';
}//翻转 + 转化字符为int
}
int main()
{
cin >> s1 >> s2;
z_int(s1, a); z_int(s2, b); // 把大整数送入函数使int数组a,b记录上它们
int len_a = strlen(s1), len_b = strlen(s2); // 获取大整数的长度
for (int i = 0; i < len_a; i++) {
for (int k = 0; k < len_b; k++) { // 使a的每一位与b的每一位都可以相乘上
c[i + k] += a[i] * b[k]; // 在这个里请把c[i+k]看作整体方便理解
if (c[i + k] >= 10) {
c[i + k + 1] += c[i + k] / 10;
c[i + k] = c[i + k] % 10;
}//老套路哩
}
}
int len_c = len_a + len_b;
if (c[len_c]) len_c++; // 老套路 用于计算输出范围的
while (c[len_c - 1] == 0 && len_c > 1) len_c--; // 解决你输出一堆0的问题 比如 1 * 0
for (int i = 0; i < len_c; i++) {
cout << c[len_c -i-1];
}
return 0;
}