news 2026/4/23 15:59:08

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/23 15:27:52

【开题答辩全过程】以 基于协同过滤算法的经济型酒店推荐系统为例,包含答辩的问题和答案

个人简介一名14年经验的资深毕设内行人&#xff0c;语言擅长Java、php、微信小程序、Python、Golang、安卓Android等开发项目包括大数据、深度学习、网站、小程序、安卓、算法。平常会做一些项目定制化开发、代码讲解、答辩教学、文档编写、也懂一些降重方面的技巧。感谢大家的…

作者头像 李华
网站建设 2026/4/23 13:02:02

vue基于Spring Boot框架的在线医疗问诊咨询平台的设计与实现_20369237

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

作者头像 李华
网站建设 2026/4/23 15:51:20

口碑好的廊坊市企业营销策划哪个好

口碑好的廊坊市企业营销策划哪个好 在当今竞争激烈的市场环境中&#xff0c;选择一家口碑好的企业营销策划公司对于企业的成功至关重要。廊坊市作为河北省的重要城市之一&#xff0c;拥有众多优秀的企业营销策划公司。本文将重点介绍一家在当地享有良好口碑的公司——快印客众…

作者头像 李华
网站建设 2026/4/23 15:53:55

开发功能开关-–-behaviac

原文 behaviac的运行时提供有核心的更新行为树的功能&#xff0c;在其之上&#xff0c;还有logging&#xff0c;热加载&#xff0c;连调等调试功能。这些调试功能只是‘开发’功能&#xff0c;在游戏发布后实际上是不需要的。 除了可以在config.h中定义BEHAVIAC_RELEASE宏为1…

作者头像 李华
网站建设 2026/4/18 3:57:14

DAY37 早停策略和模型权重的保存

浙大疏锦行 import torch import torch.nn as nn import torch.optim as optim from sklearn.datasets import load_iris from sklearn.model_selection import train_test_split import numpy as npirisload_iris() Xiris.data yiris.targetX_train,X_test,y_train,y_testtra…

作者头像 李华