news 2026/6/10 13:17:31

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/6/10 13:09:21

古风权谋动态漫制作2025推荐,多维度解析

古风权谋动态漫制作2025推荐&#xff0c;多维度解析在当今的文化创意产业中&#xff0c;古风权谋动态漫以其独特的魅力吸引了众多观众的目光。然而&#xff0c;制作一部高质量的古风权谋动态漫并非易事&#xff0c;需要综合考虑多个维度。那么&#xff0c;如何才能制作出一部优…

作者头像 李华
网站建设 2026/6/7 14:03:56

Zotero下载安装保姆级教程(附官网正版安装包,非常详细)

Zotero 是一款完全免费、开源、跨平台的文献管理工具&#xff0c;支持 Windows、macOS、Linux 三大桌面系统&#xff0c;也有官方 iOS 客户端。 Zotero 的核心任务只有一件&#xff0c;把你在网页、数据库、图书馆目录、PDF 文件里看到的学术资源&#xff0c;一键抓下来&#…

作者头像 李华
网站建设 2026/6/10 13:15:03

【开题答辩全过程】以 基于微信小程序的生活社区平台的设计与开发为例,包含答辩的问题和答案

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

作者头像 李华
网站建设 2026/6/9 22:22:42

Cplusplus生成代码大小的说明-–-behaviac

原文 C版本广泛的用到了template。 Code bloat occurs because compilers generate code for all templated functions in each translation unit that use them. Back in the day the duplicate code was not consolidated resulting in “code bloat”. These days the dupl…

作者头像 李华
网站建设 2026/6/9 5:27:47

手把手拆解三菱PLC印字机实战项目

三菱PLC组装印字机完整项目资料 1、采用三菱FX3U,威纶通MT6071IP触摸屏 &#xff08; 2、有说明书&#xff0c;BOM零件表&#xff0c;电路图 3、程序有完整的注释&#xff0c;结构清晰明了。 很好的项目学习资料。 工业02-18.电气印字机电气最近淘到一套工业级印字机的完整项目…

作者头像 李华
网站建设 2026/6/7 21:26:53

QSharedMemory 变量在对象析构的时候要怎么处理

在Qt中使用QSharedMemory时&#xff0c;对象析构时的正确处理至关重要&#xff0c;主要涉及共享内存的释放和跨进程同步问题。以下是关键处理原则和步骤&#xff1a; 1. 自动析构行为&#xff08;Qt内置机制&#xff09; 自动detach()&#xff1a;当QSharedMemory对象销毁时&…

作者头像 李华