算法学习系列(六):高精度加法、减法、乘法、除法

目录

  • 引言
  • 一、高精度加法
    • 1.题目描述
    • 2.代码实现
    • 3.测试
  • 二、高精度减法
    • 1.题目描述
    • 2.代码实现
    • 3.测试
  • 三、高精度乘法
    • 1.题目描述
    • 2.代码实现
    • 3.测试
  • 四、高精度除法
    • 1.题目描述
    • 2.代码实现
    • 3.测试

引言

本文介绍了高精度加法、高精度减法、高精度乘法、高精度除法,这个高精度来说还是有点用的,在一些竞赛啥的还是能用得上的,当然了这个只针对C++来说,java或者python本身就有大整数类型,没必要搞这个。

一、高精度加法

当然先说一下什么是高精度,就是一个很长的数,拿long long也存不下的这种,虽然long long很大有9.2*10^18那么大,可是长度也就19而已,所以要是我输入一个长度50或者100的数,就没有办法了,所以这就是高精度存在的意义,然后思想就是拿string来存,然后根据一些运算特性每一位每一位的处理,然后整合就是最终结果了。

1.题目描述

给定两个正整数(不含前导 0),计算它们的和。输入格式
共两行,每行包含一个整数。输出格式
共一行,包含所求的和。数据范围:1≤整数长度≤100000输入样例:
12
23
输出样例:
35

2.代码实现

说一下思路啊,首先是输入的问题,因为要加法,肯定是从个位加的,然后需要进位,所以肯定个位是从0号下标开始好,因为如果从size-1号下标遍历也行,只不过如果牵扯到进位的话,那么就得从头插了,那就需要特判还要移动整个数组就太费劲了,所以选择把个位存到0号下标去。
然后是加法的问题了,首先定义一个t代表进位,然后从个位开始循环每一位,因为不知道A和B谁长所以循环条件这样写,然后t也可能最后也有进位所以也加入判断条件了,因为最后i可能会超出A或者B的范围,所以在循环里还要判断一下才能加,然后t % 10存到C中,t /= 10,就完成了一次操作,最后要把前导0给去掉,最后从后向前输出C就行了。

#include <iostream>
#include <vector>using namespace std;vector<int> add(vector<int> &A, vector<int> &B)
{vector<int> C;int t = 0;for(int i = 0; i < A.size() || i < B.size() || t; ++i){if(i < A.size()) t += A[i];if(i < B.size()) t += B[i];C.push_back(t % 10);t /= 10;}return C;
}int main()
{string a, b;cin >> a >> b;vector<int> A, B;for(int i = a.size() - 1; i >= 0; --i) A.push_back(a[i] - '0');for(int i = b.size() - 1; i >= 0; --i) B.push_back(b[i] - '0');auto C = add(A, B);for(int i = C.size() - 1; i >= 0; --i) printf("%d", C[i]);return 0;
}

3.测试

可以看出是完全正确的,也AC了
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

二、高精度减法

1.题目描述

给定两个正整数(不含前导 0),计算它们的差,计算结果可能为负数。输入格式
共两行,每行包含一个整数。输出格式
共一行,包含所求的差。数据范围
1≤整数长度≤105输入样例:
32
11
输出样例:
21

2.代码实现

这个减法其实跟加法差不多,区别在于,如果是负数,还是大的减去小的,只不过前面要添个’-',其余的问题看代码或者注释问题都不太大了

#include <iostream>
#include <vector>using namespace std;bool cmp(string a, string b)  //a >= b ?
{if(a.size() != b.size()) return a.size() > b.size();for(int i = 0; i < a.size(); ++i){if(a[i] != b[i]) return a[i] > b[i];}return true;
}vector<int> sub(vector<int> &a, vector<int> &b)
{vector<int> C;int t = 0;for(int i = 0; i < a.size(); ++i){t += a[i];if(i < b.size()) t -= b[i];  //因为b是小于a的C.push_back((t + 10) % 10);  //t可能大于0,也可能小于0,这样做全包括了if(t < 0) t = -1;else t = 0;}while(C.size() > 1 && C.back() == 0) C.pop_back();  //可能存在前导0return C;
}int main()
{string a, b;cin >> a >> b;bool sign = cmp(a,b);if(!sign){printf("-");swap(a,b);}vector<int> A, B;for(int i = a.size() - 1; i >= 0; --i) A.push_back(a[i] - '0');for(int i = b.size() - 1; i >= 0; --i) B.push_back(b[i] - '0');auto C = sub(A,B);for(int i = C.size() - 1; i >= 0; --i) printf("%d", C[i]);return 0;
}

3.测试

可以看出都是正确的,然后最后也AC了
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

三、高精度乘法

1.题目描述

给定两个非负整数(不含前导 0) A 和 B,请你计算 A×B 的值。输入格式共两行,第一行包含整数 A,第二行包含整数 B。输出格式共一行,包含 A×B 的值。数据范围
1≤A的长度≤100000,0≤B≤10000输入样例:
2
3
输出样例:
6

2.代码实现

这个高精度乘法正常的算不太一样,这是从高精度的每一位算起,每一位都乘以这个小整数

#include <iostream>
#include <vector>using namespace std;vector<int> mul(vector<int> &a, int b)
{vector<int> C;int t = 0;for(int i = 0; i < a.size() || t; ++i){if(i < a.size()) t += a[i] * b;C.push_back(t % 10);t /= 10;}while(C.size() > 1 && C.back() == 0) C.pop_back();return C;
}int main()
{string a;int b;cin >> a >> b;vector<int> A;for(int i = a.size() - 1; i >= 0; --i) A.push_back(a[i] - '0');auto C = mul(A,b);for(int i = C.size() - 1; i >= 0; --i) printf("%d", C[i]);return 0;
}

3.测试

可以看出结果都是正确的,这道题也AC了
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

四、高精度除法

1.题目描述

给定两个非负整数(不含前导 0) A,B,请你计算 A/B 的商和余数。输入格式共两行,第一行包含整数 A,第二行包含整数 B。输出格式共两行,第一行输出所求的商,第二行输出所求余数。数据范围1≤A的长度≤100000,1≤B≤10000 ,B 一定不为 0输入样例:
7
2
输出样例:
3
1

2.代码实现

这里注意一下的是,这个除法是从高位算起的,但因为正常情况下给出的a个位都是0下标,然后输出也因为是个位为0下标,因为输入输出的原因所以div就处理的多了一些,不过核心还是不变的

#include <iostream>
#include <vector>
#include <algorithm>using namespace std;vector<int> div(vector<int> &a, int b, int &r)
{vector<int> C;r = 0;for(int i = a.size() - 1; i >= 0; --i){r = r * 10 + a[i];C.push_back(r / b);r %= b;}reverse(C.begin(), C.end());while(C.size() > 1 && C.back() == 0) C.pop_back();return C;
}int main()
{string a;int b;cin >> a >> b;vector<int> A;for(int i = a.size() - 1; i >= 0; --i) A.push_back(a[i] - '0');int r;  //余数auto C = div(A, b, r);for(int i = C.size() - 1; i >= 0; --i) printf("%d", C[i]);printf("\n%d", r);return 0;
}

3.测试

可以看出来也是没问题的
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/205272.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

软件开发自动化到智能文档检索:大语言模型驱动的开源项目盘点 | 开源专题 No.46

shroominic/codeinterpreter-api Stars: 2.4k License: MIT 这是一个 ChatGPT 代码解释器的开源实现项目&#xff0c;使用了 LangChain 和 CodeBoxes 进行后端沙盒式 Python 代码执行。该项目具有以下特性和优势&#xff1a; 数据集分析、股票图表绘制、图像处理等功能支持网…

KubeSphere Marketpalce 上新!Databend Playground 助力快速启动数据分析环境

12 月 5 日&#xff0c;Databend Labs 旗下 Databend Playground&#xff08;社区尝鲜版&#xff09;成功上架青云科技旗下 KubeSphere Marketplace 云原生应用扩展市场&#xff0c;为用户提供一个快速学习和验证 Databend 解决方案的实验环境。 关于 Databend Playground Dat…

Flask之手搓bootstrap翻页

使用bootstrap框架的翻页组件时&#xff0c;记起在学习使用laravel框架的时候&#xff0c;只需要添加相应的功能代码&#xff0c;就可以直接使用翻页组件了&#xff0c;但缺少自定义&#xff0c;或者说自定义起来有点麻烦。 自己手搓翻页组件&#xff0c;不仅能加深对flask的认…

STM32基础教程 p18 UART通信协议基础知识

1 UART通信协议简介 UART通信协议详细介绍 1.1 串行通信的简介 1. 单工通信&#xff1a;学校广播 2. 半双工通信&#xff1a;对讲机 3. 全双工通信&#xff1a;手机打电话 UART:通用的同步异步收发器 1.1.1 同步通信 组成&#xff1a;数据线、时钟线、偏选信号线 收发双方…

从文字到使用,一文读懂Kafka服务使用

&#x1f3c6;作者简介&#xff0c;普修罗双战士&#xff0c;一直追求不断学习和成长&#xff0c;在技术的道路上持续探索和实践。 &#x1f3c6;多年互联网行业从业经验&#xff0c;历任核心研发工程师&#xff0c;项目技术负责人。 &#x1f389;欢迎 &#x1f44d;点赞✍评论…

大数据在互联网营销中的应用:案例与策略

互联网时代的营销领域正经历着一场由大数据驱动的变革。在2023年&#xff0c;大数据的应用已成为推动市场策略和决策的关键因素。本文将探讨大数据如何影响互联网营销&#xff0c;并通过实际案例分析展示其在提升营销效果方面的作用。 首先&#xff0c;通过分析海量数据&#x…

NumSharp

github地址&#xff1a;https://github.com/SciSharp/NumSharp High Performance Computation for N-D Tensors in .NET, similar API to NumPy. NumSharp (NS) is a NumPy port to C# targetting .NET Standard. NumSharp is the fundamental package needed for scientific …

第二十一章——网络通信

一.网络程序设计基础 1.局域网与互联网 2.网络协议 1.IP协议 IP是Internet Protocol的简称&#xff0c;是一种网络协议。 1.1 TCP/IP层次结构 2.TCP与UDP协议 TCP可保证数据从一端送至另一端时&#xff0c;能够确实送达&#xff0c;而且抵达的数据的排列顺序和送出时的顺序相…

设备间的指令通信

指令通信的概念 要进行设备和设备之间的交流就需要通过串口发送数据进行交流 而串口发送简单的数据只需要传输介质 但是要发送复杂的数据就需要介质和传输的规则了 三种应用场景 比如在上位机和mcu之间 通过上位机管理控制器 从而控制电池 单片机和单片机之间 用户输入数据到…

国产麒麟操作系统部署记录

前提&#xff1a;部署项目首先要安装各种软件&#xff0c;在内网环境下无法在线下载。 思路&#xff1a;首先部署一台能上网的系统&#xff0c;在此系统下只下载包&#xff0c;然后传到另一台内网系统下进行安装&#xff1b; 1、最开始yum未安装&#xff0c;因此需要先安装yu…

C语言中的动态内存管理

在C语言中&#xff0c;动态内存管理是通过一系列的标准库函数来实现的&#xff0c;这些函数包括malloc, free, calloc 和 realloc。它们允许程序在运行时动态地分配和释放内存&#xff0c;这是管理复杂数据结构&#xff08;如链表、树等&#xff09;时非常有用的功能。 为什么…

硬件基础:运放

理想运算放大器 理想运算放大器放大倍数无穷大&#xff1b;输入端阻抗无穷大&#xff0c;所以输入端电流为0&#xff1b;输出电压和负载无关&#xff0c;不管负载怎么变化&#xff0c;输出电压都是固定的。 还有个就是输出阻抗为0&#xff1b; 输出阻抗越小&#xff0c;输出时就…

Avalonia中如何实现文件拖拽上传

前言 前面我们讲了在Avalonia中如何将View事件映射到ViewModel层感兴趣的读者可以看一下&#xff0c;本章我们将讲一下在Avalonia框架下如何实现文件和文字的拖拽到指定区域进行处理和上传。 先看效果 界面设计比较简单&#xff0c;还是在前一张的基础上加了一个指定区域&…

基于springboot + vue的社区医院信息系统

qq&#xff08;2829419543&#xff09;获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;springboot 前端&#xff1a;采用vue技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xf…

leetcode 622. 设计循环链表

这道题讲了两种方法&#xff0c;第一个代码是用数组实现的&#xff0c;第二个是用链表实现的&#xff0c;希望对你们有帮助 &#xff08;最好在VS自己测试一遍&#xff0c;再放到 leetcode上哦&#xff09; 下面的是主函数&#xff08;作参考&#xff09;&#xff0c;静下心来…

Ubuntu安装向日葵【远程控制】

文章目录 引言下载向日葵安装向日葵运行向日葵卸载向日葵参考资料 引言 向日葵是一款非常好用的远程控制软件。这一篇博文介绍了如何在 Ubuntu Linux系统 中安装贝瑞向日葵。&#x1f3c3;&#x1f4a5;&#x1f4a5;&#x1f4a5;❗️ 下载向日葵 向日葵官网: https://sunl…

动态规划学习——最长回文子序列,让字符串变成回文串的最小插入次数

一&#xff0c;最长回文串 1.题目 给你一个字符串 s &#xff0c;找出其中最长的回文子序列&#xff0c;并返回该序列的长度。 子序列定义为&#xff1a;不改变剩余字符顺序的情况下&#xff0c;删除某些字符或者不删除任何字符形成的一个序列。 示例 1&#xff1a; 输入&…

【我爱C语言】详解字符函数isdigit和字符串转换函数(atoi和snprintf实现互相转换字符串)三种strlen模拟实现

&#x1f308;write in front :&#x1f50d;个人主页 &#xff1a; 啊森要自信的主页 ✏️真正相信奇迹的家伙&#xff0c;本身和奇迹一样了不起啊&#xff01; 欢迎大家关注&#x1f50d;点赞&#x1f44d;收藏⭐️留言&#x1f4dd;>希望看完我的文章对你有小小的帮助&am…

煤矿电力监控系统

煤矿电力监控系统是一种用于煤矿电力系统的监控解决方案。该系统在重点煤矿的矿井变电站、主运输、主通风、主排水、主副提升等重要设备上加装智能用电融合终端&#xff0c;实时监测煤矿重要设备的电流、电压、负载等主要数据变化。为管理人员提供实时监测、报表管理、告警中心…

Centos7中的mysql环境安装以及卸载【Linux】

Linux中的mysql环境安装【Linux】 一. 检测mysql和mariadb是否存在二. 安装mysql2.1查看自身系统版本2.2 查看yum源2.3 选择yum源头2.4 安装yum源2.5 安装mysql2.6 启动mysql服务2.7 首次登录mysql 三. 卸载mysql3.1 关闭mysql服务3.2 查找并删除组件服务3.2.1 查找组件服务3.2…