2026/5/15 19:08:36
网站建设
项目流程
宁波网站推广联系方式,工业设计作品集案例,wordpress 图片裁剪插件,网页什么设计在处理大数运算时#xff0c;由于普通数据类型#xff08;如 int、long long#xff09;的范围限制#xff0c;我们需要用字符串模拟手工乘法的过程。本文以 LeetCode 风格的 “字符串相乘” 题目为例题目描述给定两个以字符串形式表示的非负整数 num1 和 num2#xff0c;…在处理大数运算时由于普通数据类型如 int、long long的范围限制我们需要用字符串模拟手工乘法的过程。本文以 LeetCode 风格的 “字符串相乘” 题目为例题目描述给定两个以字符串形式表示的非负整数num1和num2返回它们的乘积同样以字符串形式表示。不能使用内置的大整数库或直接将输入转换为整数。输入字符串长度范围1 ≤ length ≤ 200仅包含数字且无前置零除非本身是 “0”。核心思路模拟手工乘法手工乘法的步骤是用num2的每一位去乘num1的每一位将结果按位累加最后处理进位得到最终结果。具体步骤初始化临时数组两个长度为len1和len2的数相乘结果长度最多为len1len2因此用一个长度为len1len2的数组temp存储每一位的累加结果。按位相乘并累加遍历num1和num2的每一位计算乘积后将 “个位” 累加到temp[ij1]“十位”进位累加到temp[ij]。处理进位与转换字符串遍历临时数组处理进位再将有效数字转换为字符形式的结果字符串完整代码实现#include stdio.h #include stdlib.h #include string.h char* multiply(char* num1, char* num2) { // 特殊情况其中一个数是0直接返回0 if (num1[0] 0 || num2[0] 0) { char* res (char*)malloc(2 * sizeof(char)); res[0] 0; res[1] \0; return res; } int len1 strlen(num1); int len2 strlen(num2); // 临时数组存储每一位的累加结果最多len1len2位 int* temp (int*)calloc(len1 len2, sizeof(int)); // 按位相乘累加结果到temp数组 for (int i len1 - 1; i 0; i--) { int digit1 num1[i] - 0; // num1的当前位数字 for (int j len2 - 1; j 0; j--) { int digit2 num2[j] - 0; // num2的当前位数字 int product digit1 * digit2; // 累加个位存到ij1十位进位存到ij int sum temp[i j 1] product; temp[i j 1] sum % 10; temp[i j] sum / 10; } } // 将temp数组转换为结果字符串 char* result (char*)malloc((len1 len2 1) * sizeof(char)); int idx 0; // 跳过开头的0如果有的话 for (int i 0; i len1 len2; i) { if (temp[i] ! 0 || idx 0) { // 避免全0已在开头处理 result[idx] temp[i] 0; } } result[idx] \0; // 字符串结束符 free(temp); // 释放临时数组 return result; } // 测试示例 int main() { char num1[] 123; char num2[] 456; char* res multiply(num1, num2); printf(结果%s\n, res); // 输出56088 free(res); return 0; }代码解释特殊情况处理如果其中一个数是 “0”直接返回 “0”避免后续无效计算。临时数组初始化用calloc初始化temp数组默认值为 0长度为len1len2。按位相乘从num1和num2的 ** 末尾低位** 开始遍历将字符转换为数字- 0。计算两位的乘积后将 “个位”sum%10存入temp[ij1]“十位”sum/10存入temp[ij]进位。结果转换遍历temp数组跳过开头的 0有效数字从第一个非 0 位开始将数字转换为字符存入结果字符串并添加结束符。注意事项内存管理C 语言中需手动分配 / 释放内存如malloc/free避免内存泄漏。字符串结束符结果字符串必须以\0结尾否则会出现乱码。边界处理需考虑 “其中一个数是 0”“结果开头有 0” 等边界情况。