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

news2024/12/23 17:48:35

目录

  • 引言
  • 一、高精度加法
    • 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();  //可能存在前导0
    
    return 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.coloradmin.cn/o/1293117.html

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

相关文章

【Java数据结构 -- List和ArrayList与顺序表】

List和ArrayList与顺序表 一. List1.1 List介绍2.1 常见接口介绍3.1 List的使用 二. ArrayList与顺序表1.线性表2.顺序表2.1 接口的实现 3.ArrayList简介4. ArrayList使用4.1 ArrayList的构造 4.2 ArrayList常见操作4.3 ArrayList的遍历4.4 ArrayList的扩容机制5. ArrayList的具…

Python 网络爬虫(二):HTTP 基础知识

《Python入门核心技术》专栏总目录・点这里 文章目录 1. HTTP 协议简述2. HTTP 请求过程3. HTTP 的结构3.1 请求行3.2 请求头3.3 请求体3.4 状态行3.5 响应头3.6 响应体4. Cookie 状态管理5. HTTP 请求示例6. 总结<

HTML5+CSS3小实例:3D翻转Tab选项卡切换特效

实例:3D翻转Tab选项卡切换特效 技术栈:HTML+CSS 效果: 源码: 【HTML】 <!DOCTYPE html> <html><head><meta http-equiv="content-type" content="text/html; charset=utf-8"><meta name="viewport" content=…

【Linux】公网远程访问AMH服务器管理面板

目录 1. Linux 安装AMH 面板2. 本地访问AMH 面板3. Linux安装Cpolar4. 配置AMH面板公网地址5. 远程访问AMH面板6. 固定AMH面板公网地址 AMH 是一款基于 Linux 系统的服务器管理面板&#xff0c;它提供了一系列的功能&#xff0c;包括网站管理、FTP 管理、数据库管理、DNS 管理、…

信号完整性分析

目录 前言一、信号完整性SI1.1 信号失真1.2 串扰1.3 衰减 二、电源完整性PI2.1 地弹2.2 电源轨道塌陷 三、电磁兼容EMC3.1 电磁辐射3.2 抗干扰 前言 本篇介绍信号完整性分析的知识体系&#xff0c;以及部分分析方法。   什么是信号完整性?通俗来讲&#xff0c;信号在互连线的…

若依角色与权限字符串

文章目录 一、简介1.基于权限字段串2.基于角色 二、若依的权限控制1.介绍2.实践 一、简介 基于权限字段串和基于角色的访问控制是两种不同的权限管理模型&#xff0c;它们各自有其优点和应用场景。下面是这两种模型的基本概念&#xff1a; 1.基于权限字段串 基于权限字段串&…

基于ssm实验室课程管理系统源码和论文

idea 数据库mysql5.7 数据库链接工具&#xff1a;navcat,小海豚等 环境&#xff1a; jdk8 tomcat8.5 摘 要 随着科学实验规模的不断扩大&#xff0c;实验室课程数量的急剧增加&#xff0c;有关实验室课程的各种信息量也在不断成倍增长。面对庞大的信息量&#xff0c;就需要有…

SpringCloud简介和用处

Spring Cloud是一套基于Spring Boot的微服务框架&#xff0c;它旨在提供一种快速构建分布式系统的方法。它可以帮助开发人员构建具有高可用性、可扩展性和容错性的微服务&#xff0c;并通过Spring Boot的开发工具和库提供强大的支持。 一、简介 Spring Cloud是Spring家族中的一…

Spark Structured Streaming使用教程

文章目录 1、输入数据源2、输出模式3、sink输出结果4、时间窗口4.1、时间窗口4.2、时间水印&#xff08;Watermarking&#xff09; 5、使用例子 Structured Streaming是一个基于Spark SQL引擎的可扩展和容错流处理引擎&#xff0c;Spark SQL引擎将负责增量和连续地运行它&#…

2023-2024-1-高级语言程序设计-第2次月考编程题

注&#xff1a;此前已发布过的题解不再发布&#xff08;原题请在下面位置进行搜索&#xff09;。 7-1-2 排序(算法任意) 本题要求将给定的n个整数从大到小排序后输出&#xff08;可使用任意排序算法&#xff09;。 输入格式: 输入第一行给出一个不超过10的正整数n。第二行给…

WVP-RPO开源项目搭建实践

0.拉取代码 GitHub - 648540858/wvp-GB28181-pro: WEB VIDEO PLATFORM是一个基于GB28181-2016标准实现的网络视频平台&#xff0c;支持NAT穿透&#xff0c;支持海康、大华、宇视等品牌的IPC、NVR、DVR接入。支持国标级联&#xff0c;支持rtsp/rtmp等视频流转发到国标平台&…

详细解读电力DLT698.45-2017通信规约--正向有功总电能

建立连接请看这篇&#xff1a;详细解读DLT698.45-2017通信规约--预连接响应http://mp.weixin.qq.com/s?__bizMzA3NjAwMjQzMQ&mid2652026396&idx1&sna0a17f005d23136c922a7c381ddb7e75&chksm8481f30cb3f67a1a94e66db77e61fe73c22b1904fcdbb0144108e132b265e7b4…

dtaidistance笔记:dtw_ndim (高维时间序列之间的DTW)

1 数据 第一个维度是sequence的index&#xff0c;每一行是多个元素&#xff08;表示这一时刻的record&#xff09; from dtaidistance.dtw_ndim import *s1 np.array([[0, 0],[0, 1],[2, 1],[0, 1],[0, 0]], dtypenp.double) s2 np.array([[0, 0],[2, 1],[0, 1],[0, .5],[0…

水果党flstudio用什么midi键盘?哪个版本的FL Studio更适合我

好消息&#xff01;好消息&#xff01;特大好消息&#xff01; 水果党们&#xff01;终于有属于自己的专用MIDI键盘啦&#xff01; 万众期待的Novation FLKEY系列 正式出炉&#xff01; 话有点多话&#xff0c;先分享一份干货&#xff0c;尽快下载 FL Studio 21 Win-安装包&…

搜索推荐技术-爱奇艺搜索引擎技术

一、爱奇艺的搜索引擎框架示意图 即通过召回系统&#xff0c;即基于文本匹配的matching system&#xff0c;得到大量视频资源的候选集&#xff0c;经过粗排和精排&#xff0c;最后返回给用户。重点在于召回模块和排序模块。 二、召回模块 召回模块比较重要的是基础相关性&am…

Unity Meta Quest 一体机开发(九):【手势追踪】通过录制抓取手势实现自定义抓取姿势

文章目录 &#x1f4d5;教程说明&#x1f4d5;录制前的准备&#x1f4d5;第一种录制方法&#xff08;Hand Grab Pose Tool 场景&#xff09;⭐在运行模式中确认录制⭐保存录制的手势&#xff0c;将物体做成 Prefab⭐在编辑阶段调整抓取手势&#x1f50d;Fingers Freedom&#x…

leetcode 622. 设计循环链表

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

第21章网络通信

Internet 提供了大量有用的信息&#xff0c;很少有人能在接触过Internet后拒绝它的诱惑。计算机网络实现了多台计算机间的互联&#xff0c;使得它们彼此之间能够进行数据交流。网络应用程序就是在已连接的不同计算机上运行的程序&#xff0c;这些程序借助于网络协议&#xff0c…

孩子都能学会的FPGA:第二十四课——用FPGA和格雷码实现异步FIFO

&#xff08;原创声明&#xff1a;该文是作者的原创&#xff0c;面向对象是FPGA入门者&#xff0c;后续会有进阶的高级教程。宗旨是让每个想做FPGA的人轻松入门&#xff0c;作者不光让大家知其然&#xff0c;还要让大家知其所以然&#xff01;每个工程作者都搭建了全自动化的仿…

加载离线镜像包:在线镜像离线为tar包、tar离线镜像包加载并根据imageId打tag

第一步&#xff1a;在线环境压缩离线镜像&#xff1a; 需要两个文件&#xff0c;第一个是脚本文件image_offline_load.sh脚本&#xff0c;第二个是image_list.txt 按行 存放需要离线的镜像名称 ./image_offline_load.sh save image_list.txt output.tar第二步&#xff1a;在离…