高精度加法,减法,乘法,除法

news2024/9/20 1:11:54

加法:

大整数该如何储存?

用数组储存:

把个位放在数下标为0的位置,十位放在数组下标为1的位置(也就是高位放在数组的后面)

因为这样,如果需要增加一位最高位,那我们就可以直接在vector数组的最后push_back最高位到结果数组即可。如果数组低位存的是数的高位,那么我们进行这个操作的时候就需要往后一个一个移动数组,效率很慢。

例题:

#include<bits/stdc++.h>
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();i++){
        if(i < A.size()) 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;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--) cout<<C[i];
    
    return 0;
}

减法:

总体思路:

减法和加法一样,是在数组下标小的位置储存位数小的数字

首先我们需要先判断数字A和数字B的大小,可以从高开始判断。如果大于等于直接计算A-B,否则就计算B-A,添加一个负号。

在执行减法的算法中,我们不难发现如果高位已经为0的时候就会出现前导0,例如100-97=3,在数组中储存的是003,所以我们需要去除前导0,恰好前导0刚好在数组的末尾也就是C.back()。我们只需要循环执行,如果末尾是0就pop()

例题 

#include<bits/stdc++.h>
using namespace std;
string a,b;
vector<int> A,B;
bool cmp()//判断A是否>=B 
{
	if(A.size()!=B.size()) return A.size()>B.size();
	else{
		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)
{
    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);
        
        //如果t<0说明需要借位,t设为1 
       if(t < 0) t = 1;
       else t = 0;
    }
    
    //移除前导0,最高位都在数组的最后 
    while(C.size()>1&&C.back()==0) C.pop_back();
    return C;
}
int main()
{
    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');
    //比较A和B的大小,如果A>B就直接计算A-B的大小,否则就计算B-A,加上一个负号 
    if(cmp()){
    	auto C = sub(A,B);
    	for(int i=C.size() - 1;i>=0;i--) cout<<C[i];
	}else{
		auto C = sub(B,A);
		cout<<"-";
		for(int i=C.size() - 1;i>=0;i--) cout<<C[i];
	}
    return 0;
}

除法:

整体思路:

  • 逐位模拟除法

手工长除法的核心步骤是逐位计算商和余数。为了实现这种逐位的计算过程,我们从被除数的最高位开始处理。每次将当前处理的数字(即当前位)与前一次计算的余数组合,构成一个新的“被除数”。

  • 商和余数的计算

每次构成新的“被除数”后,将它除以除数,得到商的当前位,余数则留给下一位继续处理。每一位的商计算完成后,商值存储下来,余数用于下一轮的计算。

  • 反转商的顺序

由于我们是从被除数的高位向低位处理,计算过程中得到的商是倒序的(即最低位商最先被计算出)。在最终输出时,需要将计算得到的商反转,才能得到正确的顺序。

  • 去除前导零

计算过程中可能会出现前导零(例如当某些高位不足以大于除数时,商位可能为零)。为了保证输出格式正确,需要在最终输出商时移除这些前导零。

例题:

#include<bits/stdc++.h>
using namespace std;
string a;
int b,r; //r是余数 
vector<int> A;

vector<int> div() {
    vector<int> C;//商 
    for(int i=A.size() - 1;i>=0;i--){
    	r = r*10 +A[i];
    	C.push_back(r / b);
    	r = r % b;
	}
	//由于计算过程从低位到高位逐步推进最初得到的结果向量 C 是倒序的(即最高位在最前面)。
	//为了得到一个正常顺序的结果(即最高位在最后面),需要将 C 中的元素顺序反转
	reverse(C.begin(),C.end());
    // 移除结果中的前导零
    while (C.size() > 1 && C.back() == 0) {
        C.pop_back();
    }
    return C;
}

int main() {
    cin >> a >> b;
    for(int i = a.size() - 1; i >= 0; i--) A.push_back(a[i] - '0');
    auto C = div();
    for(int i = C.size() - 1; i >= 0; i--) cout << C[i];
    cout<<endl<<r<<'\n';//输出余数 
    return 0;
}

 乘法:

详细思路:

  1. 逐位相乘

将被乘数的每一位与乘数逐一相乘,并且从低位开始处理。这相当于我们手工计算乘法时,按位进行乘法运算。

  1. 进位处理

每次计算一位的结果时,可能会产生一个进位。例如,计算某一位时结果可能是 13,则当前位为 3,进位 1。这个进位要加到下一位的计算中。

  1. 移除前导零

乘法运算可能产生一些前导零,尤其是在乘数是 0 或者被乘数中某些高位为 0 的情况下。我们需要在输出之前移除这些前导零。

例题:

#include<bits/stdc++.h>
using namespace std;
string a;
int b; 
vector<int> A;
​
vector<int> Mul() {
    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() {
    cin >> a >> b;
    for(int i = a.size() - 1; i >= 0; i--) A.push_back(a[i] - '0');
    auto C = Mul();
    for(int i = C.size() - 1; i >= 0; i--) cout << C[i];
    
    return 0;
}
​

解释乘法算法的for循环停止条件

i小于A.size()时,循环继续,处理A中的每一位数字。

i等于或大于A.size()时,只要t不为0(即还有未处理完的进位),循环也会继续。这确保了所有的进位都被正确处理,直到没有新的进位产生。

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

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

相关文章

C语言小游戏--贪吃蛇实现

C语言小游戏--贪吃蛇实现 1.游戏实现背景2.Win32 API介绍2.1什么是Win32 API2.2控制台程序(Console)2.3控制台屏幕的坐标COORD2.4GetStdHandle2.4.1函数语法2.4.2函数的使用 2.5GetConsoleCursorInfo2.5.1函数语法2.5.2函数的使用 2.6CONSOLE_CURSOR_INFO2.6.1结构体结构2.6.2结…

自制游戏手柄--电位器的使用

在前面的讨论中&#xff0c;我们考虑了使用陀螺仪来获取手柄的运动情况来进行瞄准&#xff0c; 自制实战吃鸡手柄原理-CSDN博客 也可以使用图像识别来实现&#xff0c;这里我们再考虑下使用电位器来获取运动状态&#xff0c;一个电位器可以获取到一个平面上的旋转情况&#x…

2025年25届新文出炉:如何打造Java SpringBoot Vue个性化课程推荐系统?

✍✍计算机编程指导师 ⭐⭐个人介绍&#xff1a;自己非常喜欢研究技术问题&#xff01;专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目&#xff1a;有源码或者技术上的问题欢迎在评论区一起讨论交流&#xff01; ⚡⚡ Java实战 |…

根据NVeloDocx Word模板引擎生成Word(二)

前面讲到了根据“永久免费开放的E6低代码开发平台”的NVeloDocx Word模版引擎生成Word文件的基础取数方法&#xff0c;包括取本表单字段以及引用字段&#xff0c;详见《根据NVeloDocx Word模板引擎生成Word&#xff08;一&#xff09;》。 针对这种基本的取数方法&#xff0c;…

枚举相关知识点

1.是用户定义的数据类型&#xff0c;为一组相关的常量赋予有意义的名字。 2.enum常量本身带有类型信息&#xff0c;即Weekday.SUN类型是Weekday&#xff0c;编译器会自动检查出类型错误&#xff0c;在编译期间可检查错误。 3.enum定义的枚举类有什么特点。 a.定义的enu…

Ubuntu之源码编译安装nginx

参考&#xff1a;Ubuntu之源码编译安装nginx_ubuntu编译安装nginx-CSDN博客 1.下载源码后进入源码目录&#xff0c;如下&#xff1a; cd /home/jq/wf/nginx-1.26.1 2.下载相应依赖库&#xff1a; apt-get install libpcre3-dev apt-get install openssl libssl-dev apt-get…

互联网中的情绪价值

在互联网中&#xff0c;信息的传递和分享变得越来越便捷了&#xff0c;同时&#xff0c;「情绪价值」在虚拟世界中的作用也愈加凸显。 无论是在社交媒体、即时通讯工具、各类论坛社区以及短视频平台里&#xff0c;情绪价值已然成为一种无形但是至关重要的资产&#xff0c;在默默…

BaseCTF-[Week3] 出题人已疯-快坚持不下去的第六天

DIE 查&#xff0c;发现是 .NET&#xff0c;拖⼊ dnSpy 加密的代码 private void Btn_Submit_Click(object sender, RoutedEventArgs e) { char[] array this.Tb_Input.Text.ToCharArray(); char[] array2 string.Join("", this.sentences).ToCharArray(); for (i…

php、Java、python酒店预约与送餐系统 酒店管理系统 酒店预订入住系统(源码、调试、LW、开题、PPT)

&#x1f495;&#x1f495;作者&#xff1a;计算机源码社 &#x1f495;&#x1f495;个人简介&#xff1a;本人 八年开发经验&#xff0c;擅长Java、Python、PHP、.NET、Node.js、Android、微信小程序、爬虫、大数据、机器学习等&#xff0c;大家有这一块的问题可以一起交流&…

C++第四十七弹---深入理解异常机制:try, catch, throw全面解析

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】【C详解】 目录 1.C语言传统的处理错误的方式 2.C异常概念 3. 异常的使用 3.1 异常的抛出和捕获 3.2 异常的重新抛出 3.3 异常安全 3.4 异常规范 4.自定义…

宠物狗检测-目标检测数据集(包括VOC格式、YOLO格式)

宠物狗检测-目标检测数据集&#xff08;包括VOC格式、YOLO格式&#xff09; 数据集&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1roegkaGAURWUVRR-D7OzzA?pwddxv6 提取码&#xff1a;dxv6 数据集信息介绍&#xff1a; 共有20580 张图像和一一对应的标注文件 标…

如何使用微软的Copilot AI工具将Word文档转换为PowerPoint

Copilot 让你可以将 Word 文档转换为 PowerPoint 演示文稿&#xff0c;使你能够以最小的努力制作出有针对性的演示文稿。这个功能是微软AI工具包的一部分&#xff0c;对于那些曾经盯着空白幻灯片不知道从何开始的人来说&#xff0c;这是一个颠覆性的改变。要充分利用这个工具&a…

libtool 中的 .la 文件说明

libtool 中的 .la 文件说明 1 概述 在 Linux 系统中&#xff0c;libtool 是一个用于自动化编译和链接复杂软件项目的工具&#xff0c;特别是那些使用了共享库&#xff08;.so 文件在 Linux 上&#xff0c;.dylib 在 macOS 上&#xff09;的项目。它帮助处理各种编译器和链接器…

快速上手 | 数据可观测性平台 Datavines 自定义SQL规则使用指南

摘要 本文主要介绍在 Datavines平台已有规则不能满足需求的情况下&#xff0c;如何通过自定义SQL规则来实现基于业务特性的数据质量检查。 规则介绍 自定义聚合SQL规则是 Datavines 平台中内置的一个灵活的规则&#xff0c;该规则允许用户通过编写SQL的方式来实现想要的数据质…

透传:利用 vercel 部署 OpenAI Proxy

透传&#xff1a;通俗理解国内ping不通国外大模型&#xff0c;需要做一层代理通过本地调用国外大模型官方的key。 一、利用 vercel 部署 OpenAI Proxy 第一步&#xff1a;Fork OpenEE 这个仓库 https://github.com/openaiee/openaiee 第二步&#xff1a;创建vercel项目 第三步…

『功能项目』战士的平A特效【35】

我们打开上一篇34武器的切换实例的项目&#xff0c; 本章要做的事情是在战士的每次按A键时在指定位置生成一个平A特效 首先将之前下载的技能拖拽至场景中 完全解压缩后重命名为AEffect 拖拽至预制体文件夹 进入主角动画的战士动画层级 双击第一次攻击 选择Animation 创建事件 …

【C++】栈和队列、优先级队列、适配器原理

目录 一.栈和队列相关接口 二.适配器介绍 三.栈和队列模拟实现 四.deque介绍 五.优先级队列 六.优先级队列的模拟实现 1.基本结构 2.插入删除操作 一.栈和队列相关接口 1.栈&#xff08;Stack&#xff09;的接口 由于栈接口只能支持栈顶插入&#xff08;入栈&#xff0…

【C语言版】数据结构教程(二)线性表

【内容简介】本文整理数据结构&#xff08;C语言版&#xff09;相关内容的复习笔记&#xff0c;供各位朋友借鉴学习。本章内容更偏于记忆和理解&#xff0c;请读者们耐心阅读。同时&#xff0c;这里提醒各位读者&#xff0c;尽管书本上说本书用的是 C 语言版&#xff0c;但是中…

基于javaweb的茶园茶农文化交流平台的设计与实现(源码+L文+ppt)

springboot基于javaweb的茶园茶农文化交流平台的设计与实现&#xff08;源码L文ppt&#xff09;4-20 系统功能结构 系统结构图可以把杂乱无章的模块按照设计者的思维方式进行调整排序&#xff0c;可以让设计者在之后的添加&#xff0c;修改程序内容的过程中有一个很明显的思维…

使用 WebStorm 导入已有的 Vue 项目并运行的步骤与注意事项

目录 1. 引言2. WebStorm 环境准备2.1 安装 WebStorm2.2 配置 Node.js 和 npm2.3 使用 nvm 管理 Node.js 和 npm 版本2.4 npm 版本与 Vue 版本对应关系 3. 导入已有的 Vue 项目3.1 打开 Vue 项目3.2 安装项目依赖3.3 使用 nvm 控制 Node.js 和 npm 版本 4. 运行 Vue 项目4.1 启…