高精度(加法+减法+除法+乘法)合集

news2025/1/20 18:39:58

 由于c++/c语言特性,当数很大时,就要考虑精度问题,python和java则不用,因此c++学会精度运算很重要的,这里作个总结

1.高精度加法

给定两个正整数(不含前导 0),计算它们的和。

输入格式

共两行,每行包含一个整数。

输出格式

共一行,包含所求的和。

数据范围

1≤整数长度≤100000

输入样例:

12
23

输出样例:

35

 思路:,这么大的数字用int,long long之类的肯定不好处理,但如果把一个很大数字的每一位存进一个数组里,那就很好的解决这个问题,这里用vector存储避免数组开太大,多的用不到。

存入一个数组之后两个数组就是每一位相加,大于10就进位,和小学时学的数学相加一样,不废话直接出代码

代码实现:

#include<iostream>
#include<vector>
using namespace std;

//计算C
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();i++)
    {
        if(i<A.size()) t+=A[i];
        if(i<B.size()) t+=B[i];
        C.push_back(t%10);//c的值就是进位的个位数
        t/=10;把t的个位数去掉只剩下十位数,即只剩下这个位置的进位
    }
    if(t) C.push_back(1);//如果t==1,表示还有一个进位,要补上
    return C;
}

int main()
{
    string a,b;//由于数字可能很长,用string存储
    cin>>a>>b;
    vector<int> A,B;
    
    //A和B倒着放进int数组,因为有进位,倒着放容易处理
    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--) cout<<C[i];
    cout<<endl;
    return 0;
}

 2.高精度减法

给定两个正整数(不含前导 0),计算它们的差,计算结果可能为负数。

输入格式

共两行,每行包含一个整数。

输出格式

共一行,包含所求的差。

数据范围

1≤整数长度≤105

输入样例:

32
11

输出样例:

21

 思路:和高精度加法一样,这里一样用了我们小学学的减法的公式,每一位与每一位对应相减,不够就要往高位借位,如果被减的数比减它的数更大,此时可以变成-(被减的数-原本该减它的数),比如我要求4-9,此时需要输出-5,可以看成-(9-4),保证里面大数减去小数,我们的代码就更容易实现

代码实现:

#include<iostream>
#include<vector>
using namespace std;
//判断A和B的长度哪个大
bool cmp(vector<int> &A,vector<int> &B)
{
    if(A.size()!=B.size()) return A.size()>B.size();//假如大于号为真,则返回前面的值,否则返回后面的值
    
    for(int i=A.size()-1;i>=0;i--)
        if(A[i]!=B[i]) return A[i]>B[i];
    return true;
}
vector<int> sub(vector<int> &A,vector<int> &B)//这里通过前面的判断,进来的A长度必然>=B的长度
{
    vector<int> C;
    int t=0;
    for(int i=0;i<A.size();i++)
    {
        t=A[i]-t;
        if(i<B.size()) t-=B[i];
        C.push_back((t+10)%10);
        if(t<0) t=1;
        else t=0;
    }
    while(C.size()>1&&C.back()==0) C.pop_back();//这步操作是为了去除前面的0,比如600-599=001,前面的两个0要去掉
    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');

    vector<int> C;
    if(cmp(A,B)) C=sub(A,B);
    else C=sub(B,A),cout<<"-";
    for(int i=C.size()-1;i>=0;i--) cout<<C[i];
    cout<<endl;
    return 0;
}

3.高精度乘法

给定两个非负整数(不含前导 0) A 和 B,请你计算 A×B 的值。

输入格式

共两行,第一行包含整数 A,第二行包含整数 B。

输出格式

共一行,包含 A×B 的值。

数据范围

1≤A的长度≤100000,
0≤B≤10000

输入样例:

2
3

输出样例:

6

 思路:仍然是用小学我们学数学的乘法思路进行计算,由于这里是一个很大的数和一个小数相乘,因此就是把大数存入数组,从个位开始每个元素乘以 该小数b,留下模10后的数,进除以10后的数,这里直接放代码更好理解。(两个大数相乘稍微改一下思路就行,这题是大数乘小数)

代码实现:

#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
vector<int> xiaochou(vector<int>&A,int b)
{
    vector<int> C;
    int t=0;//进位
    for(int i=0;i<A.size()||t;i++)//这里注意假如t还存在也要继续存
    {
        if(i<A.size()) t+=A[i]*b;
        C.push_back(t%10);//把每个位置相乘后的数模10存进C中
        t/=10;//除10,进位
    }
    
    while(C.size()>1&&C.back()==0) C.pop_back();//假如相乘为0,比如26乘0的话就会等于00,
                                                //应当去除掉多余的0只保留一个
    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=xiaochou(A,b);
    for(int i=C.size()-1;i>=0;i--) printf("%d",C[i]);
    cout<<endl;
    return 0;
}

 4.高精度除法

给定两个非负整数(不含前导 0) A,B,请你计算 A/B 的商和余数。

输入格式

共两行,第一行包含整数 A,第二行包含整数 B。

输出格式

共两行,第一行输出所求的商,第二行输出所求余数。

数据范围

1≤A的长度≤100000,
1≤B≤10000,
B 一定不为 0

输入样例:

7
2

输出样例:

3
1

 思路:同样是小学我们学除法的思路,如图所示

 代码实现也不难,这里直接给出来了

代码实现:

#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
vector<int> xiaochou(vector<int>&A,int b,int& r)//这里要注意r要传入指针,r改变主函数的r也改变
{
    vector<int> C;

    for(int i=A.size()-1;i>=0;i--)
    {
        r=r*10+A[i];//(前一位的余数*10+当前该数)即是此时应当被b除的数
        C.push_back(r/b);
        r%=b;
    }

    reverse(C.begin(),C.end());//这里翻转是为了更好的出去无用的前导0
    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=0;//存储余数
    auto C=xiaochou(A,b,r);
    for(int i=C.size()-1;i>=0;i--) printf("%d",C[i]);
    printf("\n%d\n",r);
    return 0;
}

注意:这里可能有人会疑惑为什么还要倒序存入A中,这里正常来讲由于除法的特性其实不倒叙更好,但是由于一般的题目中不可能只考一个除法(由前面知道加减乘都是倒序存储),因此我们统一给他倒序存入,方便其他操作(如加减乘)

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

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

相关文章

一定要会的算法复杂度分析

本文首发自「慕课网」&#xff0c;想了解更多IT干货内容&#xff0c;程序员圈内热闻&#xff0c;欢迎关注"慕课网"&#xff01; 原作者&#xff1a;s09g|慕课网讲师 我们知道面对同一道问题时可能有多种解决方案。自然地&#xff0c;我们会将多种方法进行比较。那么…

【Linux】网络协议(应用层与传输层)

应用层传输层协议 应用层HTTP协议格式请求格式响应格式头部字段中的 Cookie (请求头) & Set-Cookie(响应头)cookiesession&#xff1a;会话cookie vs session HTTPS 协议&#xff1a;对 HTTP 协议进行加密 传输层UDP 协议TCP 协议 应用层 序列化&#xff1a;指将多个数组对…

使用shell封装Linux命令实现自定义Linux命令

前言 在日常工作中&#xff0c;尤其是在Linux上做开发的同学或者运维的同学们肯定会遇到过如下场景&#xff0c;比如在Linxu下通过find查找一个文件并且想看这个文件的详细信息&#xff0c;如果直接使用命令可能会一时想不起来&#xff0c;或者想起来了但是有个别参数忘记了。…

SpringMVC02注解与Rest风格

SpringMVC02 SpringMVC的注解 一、RequestParam 1、RequestParam注解介绍 位置&#xff1a;在方法入参位置作用&#xff1a;指定参数名称&#xff0c;将该请求参数 绑定到注解参数的位置属性 name&#xff1a;指定要绑定的请求参数名称&#xff1b; name属性和value属性互为…

vue-quill-editor富文本编辑框使用

vue富文本中实现上传图片及修改图片大小等功能。 1&#xff0c;配置使用 配置使用网上很多&#xff0c;记录下自己的使用过程 第一步&#xff1a;components/Editor文件夹下创建QuillEditor.vue文件 <template><div :class"prefixCls"><quill-edito…

bitset的用法

bitset的用法 bitset介绍 C的 bitset 在 bitset 头文件中&#xff0c;它是一种类似数组的结构&#xff0c;它的每一个元素只能是&#xff10;或&#xff11;&#xff0c;每个元素仅用&#xff11;bit空间&#xff0c;相当于一个char元素所占空间的八分之一。 bitset中的每个…

MyBatis-Plus Generator v3.5.1 最新代码自动生成器

一、概述 官网&#xff1a;https://baomidou.com/ 官方文档 &#xff1a;https://baomidou.com/pages/56bac0/ 官方源码地址&#xff1a; https://gitee.com/baomidou/mybatis-plus 官方原话&#xff1a; AutoGenerator 是 MyBatis-Plus 的代码生成器&#xff0c;通过 Auto…

【TMT数据传不到MES中间库】-F18

MES中间库有张表:T_Z_ERPSCInfo TMT机台落纱后,会把落纱的数据传到T_Z_ERPSCInfo去。 目前总是有几个机台(以F18举例),落纱了,数据没有过来。 起初以为是没有访问权限的问题,在机台上telnet ip+端口,发现没问题。 后来认为是数据库的账号有问题。 download了一份日…

Oracle EBS数据定义移植工具:FNDLOAD

在实际的EBS二次开发中&#xff0c;我们经常会碰到需要在各个环境之间移植二次开发的程序对象以及数据定义&#xff0c;如在EBS二次开发中并发请求的定义会涉及到&#xff1a; 可执行、并发程序、值集、请求组等的定义&#xff0c;定义需要从开发环境、测试环境、UAT环境一直到…

AI智慧工地视频分析系统 yolov7

AI智慧工地视频分析系统通过yolov7网络模型视频智能分析技术&#xff0c;AI智慧工地视频分析算法模型对画面中物的不安全状态以及现场施工作业人员的不合规行为及穿戴进行全天候不间断实时分析&#xff0c;发现有人不合规行为及违规穿戴抽烟打电话等立即自动抓拍存档告警。在架…

跨平台开发之 Tauri

比起 Electron&#xff0c;Tauri 打包后的安装包体积是真的小。 跨平台开发 最近使用跨平台开发框架写了一个软件&#xff0c;在此记录一下。 说起跨平台开发&#xff0c;我的理解是这样的&#xff1a; 多依赖浏览器环境运行多使用前端语言进行开发只需一次编码&#xff0c;…

JavaScript的this关键字

文章目录 一、JavaScript this 关键字总结 一、JavaScript this 关键字 面向对象语言中 this 表示当前对象的一个引用。 但在 JavaScript 中 this 不是固定不变的&#xff0c;它会随着执行环境的改变而改变。 在方法中&#xff0c;this 表示该方法所属的对象。 如果单独使用&a…

2023/4/18总结

项目 实现了服务器和客户端的连接&#xff0c;在登录注册上面。 然后去实现了密码MD5化&#xff0c;通过java自带的&#xff0c;去实现了MD5. public String getMD5(String str) throws NoSuchAlgorithmException {MessageDigest mdMessageDigest.getInstance("MD5&quo…

SSTI模板注入小结

文章目录 一、漏洞简述&#x1f37a;二、flask模板注入&#x1f37a;三、shrine&#xff08;攻防世界&#xff09;&#x1f37a;四、SSTI注入绕过&#x1f37a; 一、漏洞简述&#x1f37a; 1、SSTI&#xff08;Server-Side Template Injection&#xff0c;服务器端模板注入&am…

5个面向Python高级开发者的技巧

使用这些用于自定义类行为、编写并发代码、管理资源、存储和操作数据以及优化代码性能的高级技术来探索 Python 的深度。 本文探讨了 Python 中的五个高级主题&#xff0c;它们可以为解决问题和提高代码的可靠性和性能提供有价值的见解和技术。从允许您在定义类时自定义类行为的…

SpringBoot基础学习之(二十):Shiro与Thymeleaf的整合版本

还是一样&#xff0c;本篇文章是在上一篇文章的基础上&#xff0c;实施再次进阶 Shiro是一种特别的流行的安全框架&#xff0c;Thymeleaf则是spring boot架构中使用的一种特别引擎。今天介绍的则是它们俩的整合版本。 实现的功能&#xff1a;前端的显示的内容&#xff0c;是根…

vi/vim命令,使用vi编辑器命令详解

linux常用命令:vi/vim vi命令有三种模式&#xff1a;一般模式&#xff0c;编辑模式&#xff0c;命令模式&#xff08;底行模式&#xff09; 可以通过 vi [文件路径]文件名 的命令启动vi&#xff0c;并且打开指定的文件进行查看、编辑&#xff0c;其中[文件路径] 是可选参数。如…

微信小程序开发:实现毛玻璃效果

前言 在微信小程序开发的时候&#xff0c;也会遇到一些和在前端开发一样的样式需求&#xff0c;二者的相通类似性非常的高&#xff0c;就拿样式相关的需求来说&#xff0c;可以说是一模一样的操作。那么本文就来分享一个关于实现高斯模糊效果的需求&#xff0c;微信小程序和前端…

【Linux网络服务】FTP服务

FTP服务 一、FTP服务1.1FTP服务概述1.2FTP服务的特点1.3FTP服务工作过程 二、设置FTP服务2.1实验一&#xff1a;设置匿名用户访问FTP服务&#xff08;最大权限&#xff09;2.2实验二&#xff1a;设置本地用户验证访问ftp&#xff0c;并禁止切换到ftp以外的目录&#xff08;默认…

Linux- 进程的切换和系统的一般执行过程

我想在介绍进程切换之前&#xff0c;先引入中断的相关知识&#xff0c;它是我们理解进程切换的重要前提&#xff0c;也是Linux操作系统的核心机制。 中断的类型 • 硬件中断&#xff08;Interrupt&#xff09;&#xff0c;也称为外部中断&#xff0c;就是CPU的两根引脚&…