当前位置: 首页 > news >正文

大整数乘法运算

// // Created by Administrator on 2026/3/28. // #include <stdio.h> #include <stdlib.h> #include <string.h> #define MAXSIZE 1000 // 大整数支持的最大位数 // 大整数结构体定义(与教材完全一致) typedef struct { int digits[MAXSIZE]; // 低位到高位依次存储,digits[0] 是个位 int length; // 有效数字位数 int sign; // 符号:1 为正,-1 为负 } BigInt; // ------------------- 1. 字符串转大整数 ------------------- BigInt StrToBigInt(const char *s) { BigInt num; num.length = 0; num.sign = 1; int len = strlen(s); int i = 0; if (s[0] == '-') { num.sign = -1; i = 1; } // 从后往前读,低位存到数组前面 for (int j = len - 1; j >= i; j--) { num.digits[num.length++] = s[j] - '0'; } return num; } // ------------------- 2. 打印大整数 ------------------- void PrintBigInt(BigInt num) { if (num.length == 0) { printf("0\n"); return; } if (num.sign == -1) { printf("-"); } // 从高位到低位打印 for (int i = num.length - 1; i >= 0; i--) { printf("%d", num.digits[i]); } printf("\n"); } // ------------------- 3. 大整数乘法(教材伪代码实现) ------------------- BigInt BigIntMultiply(BigInt a, BigInt b) { BigInt c; // 1. 处理结果为0的特殊情况 if (a.length == 0 || b.length == 0) { c.sign = 1; c.length = 0; return c; } // 2. 判断结果的符号位 if (a.sign == b.sign) { c.sign = 1; } else { c.sign = -1; } // 3. 确定结果的位数,并初始化 c.length = a.length + b.length - 1; for (int i = 0; i < c.length; i++) { c.digits[i] = 0; } // 4. 按位相乘并累加 for (int i = 0; i < a.length; i++) { for (int j = 0; j < b.length; j++) { c.digits[i + j] += a.digits[i] * b.digits[j]; } } // 5. 从低位到高位处理进位 int carry = 0; for (int i = 0; i < c.length; i++) { int temp = c.digits[i] + carry; c.digits[i] = temp % 10; carry = temp / 10; } // 6. 处理最高位进位 if (carry > 0) { c.digits[c.length++] = carry; } // 7. 消除高位前导0 while (c.length > 0 && c.digits[c.length - 1] == 0) { c.length--; } return c; } // ------------------- 测试主函数 ------------------- int main() { // 测试用例1:正数相乘 123 × 456 = 56088 BigInt a = StrToBigInt("123"); BigInt b = StrToBigInt("456"); printf("a = "); PrintBigInt(a); printf("b = "); PrintBigInt(b); BigInt product = BigIntMultiply(a, b); printf("a × b = "); PrintBigInt(product); // 测试用例2:带负数相乘 -123 × 456 = -56088 BigInt c = StrToBigInt("-123"); printf("\nc = "); PrintBigInt(c); printf("b = "); PrintBigInt(b); BigInt product2 = BigIntMultiply(c, b); printf("c × b = "); PrintBigInt(product2); // 测试用例3:乘以0 999 × 0 = 0 BigInt d = StrToBigInt("999"); BigInt zero = StrToBigInt("0"); printf("\nd = "); PrintBigInt(d); printf("zero = "); PrintBigInt(zero); BigInt product3 = BigIntMultiply(d, zero); printf("d × zero = "); PrintBigInt(product3); return 0; }

两数相乘,其结果的位数至少是两数位数之和-1.

乘法思想:个位乘个位算个位,个位累加。

个位乘百位算百位,百位乘个位算百位,十位乘十位算百位。百位累加。

http://www.jsqmd.com/news/561868/

相关文章:

  • 龙虾尝鲜记(6)——Spec Kit 安装与使用全流程
  • Win11Debloat个性化配置指南:定制你的Windows系统体验
  • 告别性能玄学:用Unreal Insights的Trace Store和导出功能,给你的UE5项目做一次深度“体检报告”
  • 非原生微信小程序逆向:H5页面调试与授权劫持技巧
  • 突破平台壁垒的Scratch作品打包工具:TurboWarp Packager全解析
  • 如何3步搭建高效Web直播系统:Jessibuca Pro终极指南
  • 一文搞懂分库分表数据倾斜:问题、原理与解决方案
  • AD9361数字增益的隐藏陷阱:为什么你的SNR没有提升?(MGC模式避坑指南)
  • Linux命令-mpstat(显示各个可用CPU的状态)
  • 使用Yakit打BurpSuite靶场:API测试篇(API testing)
  • 嵌入式C语言轻量级单元测试框架Unity设计与实践
  • Elasticsearch:如何在 Elastic AI Builder 里使用 DSL 来查询 Elasticsearch
  • 磁盘smart信息
  • 号码品牌认证服务商哪家口碑好?从售后响应速度看服务质量 - 企业服务推荐
  • 告别环境混乱:Python3.9镜像实战教程,独立环境管理如此简单
  • Koikatsu游戏优化补丁:KK-HF_Patch完整指南与安装教程
  • Elasticsearch:如何在 workflow 里调用一个 agent
  • 基于YOLOv11目标检测结果的图像再创作:Wan2.2-I2V-A14B场景重构
  • 智能卡开发实战:ISO7816 APDU命令与响应全解析(附常见错误码对照表)
  • 探索Charticulator:如何通过交互式布局构建实现数据可视化创新
  • LDO芯片数据手册关键参数解析指南
  • 亲测能100%去AI味的论文神器,过审太省心了!
  • PingFangSC字体完整指南:跨平台字体解决方案的3大优势与快速集成方法
  • 文脉定序系统Anaconda环境配置:创建独立的Python开发环境
  • 基于Youtu-Parsing的数据库课程设计:实现文档信息自动入库系统
  • C#重难点知识梳理(从循环语句到面向对象)
  • 免费解锁付费内容:Bypass Paywalls Clean技术深度剖析与实战全解
  • CS Demo Manager深度解析:如何构建专业的Counter-Strike比赛分析系统
  • OSAL定时器从入门到精通:单次、周期、低功耗配置全解析(基于STM32与Z-Stack)
  • GitHub Copilot 默认启用训练之后 企业安全如何应对