news 2026/4/16 12:26:28

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/4/13 17:41:16

vue基于Spring Boot框架的在线云音乐系统的设计_kbl56pmy

目录具体实现截图项目介绍论文大纲核心代码部分展示项目运行指导结论源码获取详细视频演示 &#xff1a;文章底部获取博主联系方式&#xff01;同行可合作具体实现截图 本系统&#xff08;程序源码数据库调试部署讲解&#xff09;同时还支持java、ThinkPHP、Node.js、Spring B…

作者头像 李华
网站建设 2026/4/15 19:01:16

Java并发编程的基石:深入剖析CAS原理与实战

文章目录1 前言&#xff1a;从简单的计数器问题说起2 什么是CAS&#xff1f;一个拍卖会的比喻3 CAS的底层原理&#xff1a;从Java代码到CPU指令3.1 Java层面的CAS实现3.2 深入硬件&#xff1a;CPU指令层面的实现4 CAS在Java中的应用场景4.1 原子类&#xff1a;AtomicInteger等4…

作者头像 李华
网站建设 2026/4/9 22:09:14

教程9:枚举的添加和使用-–-behaviac

原文 本文档描述的是3.6及以后版本&#xff0c;对于3.5及以前的老版本请参考分类“3.5”。对于枚举类型的使用&#xff0c;包括新增全新的枚举和扩展使用已有的枚举。对于新增的枚举&#xff0c;又包括编辑器是否自动生成该枚举的代码。 实际上&#xff0c;我们将新增枚举&am…

作者头像 李华
网站建设 2026/4/16 10:17:52

Node.js `import.meta` 深入全面讲解

import.meta 是 ES 模块&#xff08;ESM&#xff09;特有的元数据对象&#xff0c;提供当前模块的上下文信息&#xff0c;是 ES 标准的一部分&#xff08;ES2020 引入&#xff09;&#xff0c;Node.js 从 v12.2.0 开始支持&#xff08;需启用 ESM&#xff0c;v14.13.0 及以上无…

作者头像 李华