news 2026/7/5 17:21:43

C 语言实现字符串相乘(大数乘法)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
C 语言实现字符串相乘(大数乘法)

在处理大数运算时,由于普通数据类型(如 int、long long)的范围限制,我们需要用字符串模拟手工乘法的过程。本文以 LeetCode 风格的 “字符串相乘” 题目为例

题目描述

给定两个以字符串形式表示的非负整数num1num2,返回它们的乘积(同样以字符串形式表示)。

  • 不能使用内置的大整数库或直接将输入转换为整数。
  • 输入字符串长度范围:1 ≤ length ≤ 200,仅包含数字,且无前置零(除非本身是 “0”)。

核心思路:模拟手工乘法

手工乘法的步骤是:用num2的每一位去乘num1的每一位,将结果按位累加,最后处理进位得到最终结果。

具体步骤:

  1. 初始化临时数组:两个长度为len1len2的数相乘,结果长度最多为len1+len2,因此用一个长度为len1+len2的数组temp存储每一位的累加结果。
  2. 按位相乘并累加:遍历num1num2的每一位,计算乘积后,将 “个位” 累加到temp[i+j+1],“十位”(进位)累加到temp[i+j]
  3. 处理进位与转换字符串:遍历临时数组,处理进位,再将有效数字转换为字符形式的结果字符串

完整代码实现

#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); // 临时数组,存储每一位的累加结果(最多len1+len2位) 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; // 累加:个位存到i+j+1,十位(进位)存到i+j 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; }

代码解释

  1. 特殊情况处理:如果其中一个数是 “0”,直接返回 “0”,避免后续无效计算。
  2. 临时数组初始化:用calloc初始化temp数组(默认值为 0),长度为len1+len2
  3. 按位相乘
    • num1num2的 ** 末尾(低位)** 开始遍历,将字符转换为数字(- '0')。
    • 计算两位的乘积后,将 “个位”(sum%10)存入temp[i+j+1],“十位”(sum/10)存入temp[i+j](进位)。
  4. 结果转换:遍历temp数组,跳过开头的 0(有效数字从第一个非 0 位开始),将数字转换为字符存入结果字符串,并添加结束符。

注意事项

  • 内存管理:C 语言中需手动分配 / 释放内存(如malloc/free),避免内存泄漏。
  • 字符串结束符:结果字符串必须以'\0'结尾,否则会出现乱码。
  • 边界处理:需考虑 “其中一个数是 0”“结果开头有 0” 等边界情况。
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/4 17:27:54

bugku ——各种绕过哟

启动靶场读取源码<?php highlight_file(flag.php); $_GET[id] urldecode($_GET[id]); $flag flag{xxxxxxxxxxxxxxxxxx}; if (isset($_GET[uname]) and isset($_POST[passwd])) {if ($_GET[uname] $_POST[passwd])print passwd can not be uname.;else if (sha1($_GET[un…

作者头像 李华
网站建设 2026/7/5 11:44:06

运行时端的执行流程-–-behaviac

原文 在运行时端&#xff08;下面以C版来加以说明&#xff0c;C#版基本类似&#xff09;&#xff0c;整个组建的更新可以通过Workspace::Update()函数来执行&#xff0c;该函数主要包括两大功能&#xff1a; 调用DebugUpdate()函数来更新一些连调和热加载相关的功能。根据m_b…

作者头像 李华
网站建设 2026/7/3 23:00:33

教程7:行为树的连调-–-behaviac

原文 本文档描述的是3.6及以后版本&#xff0c;对于3.5及以前的老版本请参考分类“3.5”。对于行为树的调试&#xff0c;behaviac提供了连调和离线调试两大功能。 连调功能是在游戏运行的时候&#xff0c;编辑器可以连上游戏&#xff0c;实时的查看树的运行情况、变量的当前值…

作者头像 李华