| Run ID | 作者 | 问题 | 语言 | 测评结果 | 时间 | 内存 | 代码长度 | 提交时间 |
|---|---|---|---|---|---|---|---|---|
| 76153 | bnu_fanmeijie | 高精度乘法 | C++ | 通过 | 0 MS | 276 KB | 2332 | 2025-12-16 17:12:57 |
#include <iostream> #include <cstring> #include <cstdio> #include <algorithm> // 用于max函数 using namespace std; // 全局数组:存储输入字符串、数字数组、结果数组 char s1[10090], s2[10090]; int a[10090], b[10090], c[20180]; // 乘积最多为两数长度之和,故c数组长度翻倍 // 核心:高精度乘法函数 /* void highPrecisionMul() { } */ int main() { // 输入两个大数(字符串形式,支持超长数字) scanf("%s", s1); scanf("%s", s2); // 特殊情况处理:若其中一个数为0,直接输出0 if ((strcmp(s1, "0") == 0) || (strcmp(s2, "0") == 0)) { printf("0\n"); return 0; } // 执行高精度乘法 // highPrecisionMul(); int la = strlen(s1), lb = strlen(s2); // 步骤1:字符串转逆序数字数组(下标0对应个位,方便低位计算) /* memset(a, 0, sizeof(a)); memset(b, 0, sizeof(b)); memset(c, 0, sizeof(c)); // 结果数组初始化为0 */ for (int i = 0; i < la; i++) { a[i] = s1[la - 1 - i] - '0'; // a倒序 s1="123" → a[0]=3, a[1]=2, a[2]=1 } for (int i = 0; i < lb; i++) { b[i] = s2[lb - 1 - i] - '0'; // b倒序 s2="45" → b[0]=5, b[1]=4 } // 步骤2:逐位相乘(a[i] * b[j] 结果存到 c[i+j] 位置) for (int i = 0; i < la; i++) { // 遍历第一个数的每一位 for (int j = 0; j < lb; j++) { // 遍历第二个数的每一位 c[i + j] += a[i] * b[j]; // 错位累加:个位×个位→个位,个位×十位→十位,以此类推 } } // 步骤3:处理进位(逐位把超过10的部分进位到高位) int lc = la + lb; // 乘积的最大可能长度 for (int i = 0; i < lc; i++) { if (c[i] >= 10) { c[i + 1] += c[i] / 10; // 进位值:商 c[i] = c[i] % 10; // 当前位保留:余数 } } // 步骤4:去除前导零 while (lc > 1 && c[lc - 1] == 0) { lc--; } // 步骤5:输出结果(逆序输出,从高位到低位) for (int i = lc - 1; i >= 0; i--) { printf("%d", c[i]); } //printf("\n"); return 0; }