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

第三十三天:高精度运算

高精度运算:加法与乘法的C++ 实现全解析

在编程领域,处理超出常规数据类型表示范围的数值运算是一项常见且具有挑战性的任务。高精度加法和高精度乘法是其中的典型问题,下面我们将分别针对这两个问题,从问题要求、完整代码到方式方法进行详细讲解。

高精度加法

问题要求

  1. 题目描述:计算两个不超过200位的非负整数的和。
  2. 输入:输入有两行,每行是一个不超过200位的非负整数,可能存在多余的前导0。
  3. 输出:输出为一行,即两个输入整数相加后的结果,且结果不能有多余的前导0。

完整代码

#include <iostream>
#include <string>
#include <algorithm>using namespace std;string addStrings(string num1, string num2) {string result;int carry = 0;int i = num1.size() - 1;int j = num2.size() - 1;while (i >= 0 || j >= 0 || carry!= 0) {int sum = carry;if (i >= 0) {sum += num1[i] - '0';i--;}if (j >= 0) {sum += num2[j] - '0';j--;}result.push_back(sum % 10 + '0');carry = sum / 10;}reverse(result.begin(), result.end());while (result.size() > 1 && result[0] == '0') {result.erase(result.begin());}return result;
}int main() {string num1, num2;cin >> num1 >> num2;cout << addStrings(num1, num2) << endl;return 0;
}

方式方法讲解

  1. 字符串存储大整数
    • 由于要处理的整数位数多达200位,远远超出常规数值类型(如intlong long)的表示范围,所以采用string类型来存储大整数。string类型能够方便地处理长度可变的字符序列,每个字符对应大整数的一位数字。例如,字符串"123"表示整数123 ,在代码中,num1num2就是用于存储输入的两个大整数的字符串。
  2. 字符与数字的转换
    • 在进行加法运算时,需要将字符串中的字符转换为实际的数字。通过字符减去字符'0'来实现,例如,字符'5'减去'0'得到整数5 。代码中num1[i] - '0'num2[j] - '0'就是这种转换操作,将字符串中的字符形式的数字转换为数值,以便进行加法运算。
  3. 模拟竖式加法
    • 逐位相加:模拟手动竖式加法过程,从两个数的最低位开始逐位相加。通过while循环实现,ij分别初始化为num1num2的最后一位(最低位)的索引。只要num1还有未处理的位(i >= 0),或者num2还有未处理的位(j >= 0),或者有进位(carry!= 0),循环就会继续。每次循环处理一位数字的加法。
    • 进位处理:使用变量carry来保存进位。在每一位相加时,先将carry加到当前位的和sum中。例如,如果当前位相加结果为13,sum就是13 ,carry则更新为1(13除以10的商),当前位结果为3(13对10取模)。代码中carry = sum / 10用于更新进位,result.push_back(sum % 10 + '0')用于将当前位结果(转换为字符)添加到结果字符串result中。
  4. 结果处理
    • 反转结果字符串:在逐位相加的过程中,结果是从低位到高位依次生成并存储在result字符串中的,所以需要将其反转才能得到正确的数字顺序。通过调用<algorithm>头文件中的reverse函数来实现,reverse(result.begin(), result.end())result字符串中的字符顺序反转。
    • 去除前导0:为满足输出要求,结果不能有多余的前导0。通过一个while循环来实现,只要result的长度大于1且第一个字符是0,就删除第一个字符,while (result.size() > 1 && result[0] == '0') { result.erase(result.begin()); },直到result满足没有多余前导0的条件。

高精度乘法

问题要求

  1. 题目描述:输入两个高精度正整数MNMN均小于100位),求这两个高精度数的积。
  2. 输入:输入两个高精度正整数MN
  3. 输出:输出这两个高精度数的积。

完整代码

#include <iostream>
#include <string>
#include <algorithm>
#include <vector>using namespace std;string multiplyStrings(string num1, string num2) {if (num1 == "0" || num2 == "0") return "0";vector<int> product(num1.size() + num2.size(), 0);for (int i = num1.size() - 1; i >= 0; i--) {for (int j = num2.size() - 1; j >= 0; j--) {int mul = (num1[i] - '0') * (num2[j] - '0');int sum = mul + product[i + j + 1];product[i + j + 1] = sum % 10;product[i + j] += sum / 10;}}string result;for (int i = 0; i < product.size(); i++) {if (i == 0 && product[i] == 0) continue;result.push_back(product[i] + '0');}return result;
}int main() {string num1, num2;cin >> num1 >> num2;cout << multiplyStrings(num1, num2) << endl;return 0;
}

方式方法讲解

  1. 字符串存储与数字转换
    • 同样使用string类型存储大整数,利用num1[i] - '0'num2[j] - '0'将字符串中的字符转换为数字,为乘法运算做准备,与高精度加法类似。
  2. 模拟竖式乘法
    • 逐位相乘与累加:通过两层嵌套的for循环模拟竖式乘法过程。外层for循环遍历num1的每一位,内层for循环遍历num2的每一位。对于num1的第i位与num2的第j位,计算它们的乘积mul = (num1[i] - '0') * (num2[j] - '0'),然后将这个乘积与product数组中对应位置的数值相加,即int sum = mul + product[i + j + 1]。这模拟了手动竖式乘法中每一位相乘并对应相加的操作。
    • 进位处理:在累加过程中,如果某一位置的和大于等于10,需要处理进位。将和对10取模,得到的余数作为当前位的值存入product数组,即product[i + j + 1] = sum % 10;将和除以10的商作为进位加到前一位,即product[i + j] += sum / 10
  3. 使用vector存储中间结果
    • 创建一个vector<int>类型的product数组,长度为num1.size() + num2.size(),用于存储逐位相乘的中间结果。vector具有动态调整大小和高效访问元素的特点,方便在计算过程中对结果进行操作。
  4. 结果处理与转换为字符串
    • 计算完成后,将vector中的结果转换为字符串形式。首先跳过前导0(如果有),即if (i == 0 && product[i] == 0) continue;,然后将每一位数字转换为字符并添加到结果字符串result中,result.push_back(product[i] + '0'); ,最终返回处理好的结果字符串。
http://www.dtcms.com/a/389669.html

相关文章:

  • 写联表查询SQL时筛选条件写在where 前面和后面有啥区别
  • ARM(13) - PWM控制LCD
  • Python基础 3》流程控制语句
  • 牛客算法基础noob44——数组计数维护
  • 并发编程原理与实战(三十)原子操作进阶,原子数组与字段更新器精讲
  • 前端-详解Vue异步更新
  • 基于风格的对抗生成网络
  • 【JavaScript】SSE
  • JAVA算法练习题day15
  • 线性表---双链表概述及应用
  • 作业帮前端面试(准备)
  • 51单片机-使用单总线通信协议驱动DS18B20模块教程
  • 全文单侧引号的替换方式
  • NVIDIA RTX4090 在Ubuntu系统中开启P2P peer access 直连访问
  • 再次深入学习深度学习|花书笔记2
  • 中移物联ML307C模组OPENCPU笔记1
  • 计算机视觉
  • VScode实现uniapp小程序开发(含小程序运行、热重载等)
  • Redis的各种key问题
  • 元宇宙与医疗产业:数字孪生赋能医疗全链路革新
  • 为你的数据选择合适的分布:8个实用的概率分布应用场景和选择指南
  • 掌握Stable Diffusion WebUI:模型选择、扩展管理与部署优化
  • LVGL拼音输入法优化(无bug)
  • 多层感知机:从感知机到深度学习的关键一步
  • PostgreSQL绿色版整合PostGIS插件,以Windows 64位系统为例
  • GEO优化推荐案例:2025年上海源易信息科技的全链路实践
  • 时空预测论文分享:多模态融合 空间索引结构 超图 时演化因果关系
  • 智能手机产量增长4%
  • MySQL高可用MHA实战指南
  • Coze源码分析-资源库-创建工作流-后端源码-核心技术/总结