一本通1307:【例1.3】高精度乘法 1308:【例1.5】高精除
Topic:
Ideas:
此题的关键是要模拟竖式运算,竖式运算是一种直观的分步计算方式,适用于需要按位操作的四则运算,通常用于整数的加、减、乘、除等运算。因为竖式运算一般是从后往前算,因此我们在把字符串转成数组时需要倒序存储。
高精度乘法:
1.倒序存储:将数字字符串反转存入数组(如 "123"
→ [3, 2, 1]
),低位在前。
2.逐位相乘:用乘数的每一位乘以被乘数的每一位,结果按位累加(注意进位)。
3.结果合并:累加所有部分积,处理最终进位,逆序输出结果。
高精度除法:
1.倒序存储:同乘法,低位在前。
2.试商循环:从被除数高位开始,逐段与除数比较,确定当前商的最大可能值。
3.减法更新:用当前部分被除数减去除数 × 商,得到余数,继续处理下一位。
4.逆序输出:商和余数均需逆序输出,去除前导零。
核心逻辑:
模拟手算乘法,逐位相乘后累加,进位自动处理。通过试商和减法模拟竖式,逐位确定商的值。简化进位 / 借位处理,下标直接对应位数。
Code:
//2025/05/24
#include<iostream>
using namespace std;
string a, b;
int aa[205];//乘数1
int bb[205];//乘数2
int cc[405];//结果
int main() {cin >> a >> b;//字符串转数组for (int i = 0; i < a.length();i++) {aa[a.length() - i] = a[i] - '0';}for (int i = 0; i <b.length(); i++) {bb[b.length() - i] = b[i] - '0';}//模拟竖式运算for (int i =1; i <= a.length();i++) {for (int j = 1; j <= b.length();j++) {cc[i + j - 1] += aa[i] * bb[j];cc[i + j] += cc[i + j - 1] / 10;cc[i + j - 1] %= 10;}}//计算结果最长长度int len = a.length() + b.length();if (cc[len] == 0)//如果首位为0,长度减1len--;for (int i = len; i >= 1; i--) {//逆序打印cout << cc[i];}return 0;
}
//2025/5/24
#include<ios