【算法基础】1.4 高精度(模拟大数运算:整数加减乘除)

news2024/11/19 12:35:13

文章目录

  • 高精度加法
    • 题目描述
    • 解法
  • 高精度减法
    • 题目描述
    • 解法
    • 讲解
  • 高精度乘法
    • 题目描述
    • 解法
    • 讲解
  • 高精度除法
    • 题目描述
    • 解法
    • 讲解


本文主要讲解高精度计算,包括加法、减法、乘法和除法。
对于Python选手,python自带高精度计算;Java也有BigInteger类。但是对于C选手和C++选手,高精度计算的算法还是很重要的。

java相关的大数类可以参见:Java【大数类】整理


高精度加法

题目描述

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

数据范围
1 ≤ 整数长度 ≤ 100000

在这里插入图片描述

解法

cpp

#include <iostream>
#include <cstring>
#include <algorithm>
#include <vector>

using namespace std;

vector<int> add(vector<int> &A, vector<int> &B) {
    if (A.size() < B.size()) return add(B, A);
    
    vector<int> C;
    int t = 0;		// t是进位
    for (int i = 0; i < A.size(); ++i) {
        t += A[i];
        if (i < B.size()) t += B[i];
        C.push_back(t % 10);
        t /= 10;
    }
    if (t) C.push_back(t);
    return C;
}


int main()
{
    string a, b;
    vector<int> A, B;
    cin >> 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 = add(A, B);
    for (int i = C.size() - 1; i >= 0; --i) printf("%d", C[i]);
    
    return 0;
}

高精度减法

题目描述

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

数据范围
1 ≤ 整数长度 ≤ 10^5

在这里插入图片描述

解法

#include <iostream>
#include <cstring>
#include <algorithm>
#include <vector>

using namespace std;

bool cmp(vector<int> &a, vector<int> &b) {
    /* 判断是否 a 大于等于 b */
    int an = a.size(), bn = b.size();
    if (an != bn) return an > bn;
    for (int i = an - 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) {
    int an = a.size(), bn = b.size();
    vector<int> c;
    int t = 0;      // t表示是否借位
    for (int i = 0; i < an; i++) {
        a[i] -= t;      // 减去借位
        if (i < bn) a[i] -= b[i];
        c.push_back((a[i] + 10) % 10);
        if (a[i] < 0) t = 1;
        else t = 0;
    }
    while (c.size() > 1 && c.back() == 0) c.pop_back();
    return c;
}


int main()
{
    string a, b;
    vector<int> A, B, C;
    cin >> 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');
    
    if (cmp(A, B)) C = sub(A, B);
    else {
        printf("-");
        C = sub(B, A);
    }
    
    for (int i = C.size() - 1; i >= 0; --i) printf("%d", C[i]);
    
    return 0;
}

讲解

注意点包括:
判断a和b的大小;去除结果末尾的所有0;使用(t+10)%10;


高精度乘法

题目描述

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

数据范围
1 ≤ A的长度 ≤ 100000,
0 ≤ B ≤ 10000

在这里插入图片描述

解法

#include <iostream>
#include <cstring>
#include <algorithm>

using namespace std;

vector<int> mul(vector<int> A, int b) {
    int t = 0;      // t类似加法中的进位
    vector<int> C;
    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, C;
    for (int i = a.size() - 1; i >= 0; --i) A.push_back(a[i] - '0');
    C = mul(A, b);
    for (int i = C.size() - 1; i >= 0; --i) printf("%d", C[i]);
    return 0;
}

讲解

与加法类似。


高精度除法

题目描述

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

数据范围
1 ≤ A的长度 ≤ 100000,
1 ≤B ≤ 10000,
B 一定不为 0

在这里插入图片描述

解法

#include <iostream>
#include <cstring>
#include <algorithm>

using namespace std;

vector<int> div(vector<int> a, int b, int &r) {
    vector<int> c;
    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, C;
    for (int i = a.size() - 1; i >= 0; --i) A.push_back(a[i] - '0');
    int r = 0;  // r是余数
    C = div(A, b, r);
    for (int i = C.size() - 1; i >= 0; --i) printf("%d", C[i]);
    printf("\n%d\n", r);
    return 0;
}

讲解

与 加减乘 不同,除法是从高位开始的。
在这里插入图片描述

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

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

相关文章

javaEE 初阶 — 多线程— JUC(java.util.concurrent) 的常见类

文章目录1. Callable 接口1.1 Callable 的用法2. ReentrantLock2.1 ReentrantLock 的缺陷2.1 ReentrantLock 的优势3. 原子类4. 信号量 Semaphore5. CountDownLatch6. 相关面试题1. Callable 接口 类似于 Runnable 一样。 Runnable 用来描述一个任务&#xff0c;描述的任务没有…

我们一直在说数字化转型,什么才是数字化转型?

我们一直在说数字化转型&#xff0c;什么才是数字化转型&#xff1f;深度长文&#xff0c;4000字&#xff0c;融合了很多国内外专业期刊观点&#xff0c;一文讲清到底什么是企业数字化转型&#xff0c;心急的小伙伴可以先看目录&#xff1a; 关于定义——到底什么是“数字化转…

24 届秋招 | 高质量学习交流环境

大家好&#xff0c;我和一些计算机方向、背景非常优秀的、来自清华、新国立等知名大学的几位同学以及工作多年的高级研发工程师一起运营了一个知识星球。 星球里有大量国内top985、海外名校的同学在一起&#xff0c;目的是为了打造一个非常优质量的社群。 如果你也曾苦于在各…

PySimpleGUI图形化界面实现Office文件格式转换

PySimpleGUI图形化界面实现Office文件格式转换Python实现三种文件两个版本的格式转换1、doc与docx格式互相转换2、xls与xlsx格式互相转换3、ppt与pptx格式互相转换PythonPySimpleGUI实现综合版本Python实现三种文件两个版本的格式转换 1、doc与docx格式互相转换 这里主要运用…

excel求和技巧:如何忽略错误值进行求和

按照对应的订单号引用已有的收货金额&#xff0c;这种问题相信很多朋友都会处理&#xff0c;用VLOOKUP函数就能搞定。我们今天要讨论的是如何对含有错误值的数据进行求和。如果直接求和&#xff0c;得到的结果也是一个错误值&#xff0c;如下图&#xff1a;对于这种要对含有错误…

Linux驱动开发基础__ Linux中断系统中的重要数据结构

目录 1 整体概述 2 irq_desc 数组 3 irqaction 结构体 4 irq_data 结构体 5 irq_domain 结构体 6 irq_chip 结构体 1 整体概述 该文章内容&#xff0c;可以从 request_irq(include/linux/interrupt.h)函数一路分析得到。 能弄清楚下面这个图&#xff0c;对 Linux 中…

Domino Nomad Web 1.0.6!

大家好&#xff0c;才是真的好。 虽然Domino Notes 9.0.x版本早前宣布从本月开始停止市场商业推广&#xff0c;并逐步停止技术支持服。但没让人意外的是&#xff0c;12月5号&#xff0c;HCL更新了一版Domino Notes 9.0.1版本的补丁程序FP10IF10&#xff1a; 没有任何额外的说…

车规级CAN FD收发器SIT1044Q,能替代TJA1044吗?

国际知名品牌NXP推出的TJA1042Q、TJA1043Q、TJA1044Q、TJA1051Q等CAN FD收发器芯片&#xff0c;相信很多电子工程师并不陌生。这类芯片应用中&#xff0c;非常成熟稳定&#xff0c;深受汽车电子工程师的认可、支持和青睐。然而&#xff0c;在实际应用中&#xff0c;很多客户由于…

新建文本文档

Spring Boot 加载外部配置文件 Spring Boot 允许你从外部加载配置&#xff0c;这样的话&#xff0c;就可以在不同的环境中使用相同的代码。支持的外部配置源包括&#xff1a;Java属性文件、YAML文件、环境变量、命令行参数。 用Value注解可以将属性值直接注入到beans中。命令行…

【win11环境编译安装deformable Detr的MultiScaleDeformableAttention模块】

Microsoft Visual C 14.0 is required.1.Compiling CUDA operators2.安装Build Tools for Visual Studio3.安装合适的cuda4.编译1.Compiling CUDA operators cd ./models/ops sh ./make.sh # unit test (should see all checking is True) python test.pyNote: win11 or win10…

经认定的闵行区企业技术中心给予10万元资助

闵行区企业技术中心一、主管部门闵行区经济委员会二、政策依据《闵行区关于推进先进制造业高质量发展的若干产业政策意见》&#xff08;闵府规发〔2020〕5号&#xff09;《闵行区企业技术中心认定管理办法》&#xff08;闵经委规发〔2021〕2号&#xff09;《关于申报认定2022年…

搭建Go环境 03

1、windows下搭建go环境 1、介绍SDK 1、SDK&#xff08;软件开发工具包&#xff09; 2、SDK是给开发人员使用的&#xff0c;其中包含了对应开发语言的工具包 2、下载SDK Go官方镜像站(国内用户推荐): https://golang.google.cn/dl/ 官网下载 https://golang.org/dl/ # 安装事项…

【参考答案】java基础练习:变量、数据类型、输入、输出、运算符

练习1&#xff1a;判断输入的值是否是偶数&#xff0c;另外&#xff0c;要处理输入错误 (目的&#xff1a;熟悉输入、输出&#xff0c;特别是Scanner对象的方法) package com.qzcsbj;import java.util.Scanner;public class Test {public static void main(String[] args) {Sca…

Hudi集成Spark(一)Spark Shell方式

文章目录环境准备安装 Spark启动 Hadoop&#xff08;略&#xff09;spark-shell 方式启动 spark-shell插入数据查询数据查询数据更新数据增量查询指定时间点查询删除数据覆盖数据环境准备 安装 Spark 1&#xff09;Hudi 支持的 Spark 版本 HudiSupported Spark 3 version0.1…

131页8万字数字化矿山整体解决方案

【版权声明】本资料来源网络&#xff0c;知识分享&#xff0c;仅供个人学习&#xff0c;请勿商用。 【侵删致歉】如有侵权请联系小编&#xff0c;将在收到信息后第一时间删除&#xff01; 完整资料领取见文末&#xff0c;部分资料内容&#xff1a; 目 录 1、煤矿综合自动化系统…

两台 mac 通过 scp 命令快速传输数据

这两天由于电脑进水了&#xff0c;所以申请换了一台 mac 电脑&#xff0c;所以想把老电脑的数据拷贝到新电脑&#xff0c;折腾了半天&#xff0c;最后还是发现 scp 命令最好用。 使用 「scp 命令方式」之前尝试的其他方法 1、隔空投送 刚开始使用那个隔空投送功能&#xff0c;但…

数据结构与算法(一)——时间复杂度和空间复杂度

时间复杂度 1、概念引入 先说结论&#xff1a;时间复杂度是用来估计算法运行时间的一个式子&#xff08;单位&#xff09;。 例如&#xff1a;这四组代码&#xff0c;哪组运行时间最短&#xff1f; q&#xff1a;我们该用什么方式来体现算法运行的快慢&#xff1f; a&#…

安卓apk包破解

安卓apk包破解前言一、前置工作二、正式开始前言 拿到安卓的apk包如何&#xff0c;如何破解呢。流程如下 一、前置工作 拿到一个apk文件&#xff0c;修改其后缀为zip 例如&#xff1a; test.apk > test.zip 使用解压工具进行解压。解压后如图 获取到原始文件目录&…

Django项目——通过APIView实现API访问,增删改查数据库

前提 该文章在已有项目的基础上进行修改 https://blog.csdn.net/qq_38122800/article/details/128583379?spm1001.2014.3001.5502 1、配置序列化器 序列化器包含序列化和反序列化两个过程,简单点理解就是 序列化 : 将从数据库中查的数据变为前端页面可以接受的json数据 反…

机器学习的逻辑回归(Logistic)的实例————预测学生是否被录取

目录要求代码1. 导入模块2. 导入数据3. 求解theat的最优值,画出样本的位置和决策边界。4. 画出迭代函数随迭代次数变化的曲线,代价函数最终的收敛值5.比较三种学习率的代价函数随迭代次数变化的曲线5.1 学习率为0.00035.2 学习率为0.00055.3 学习率为0.00001要求 代码 1. 导入…