蓝桥杯备赛 day 3 —— 高精度(C/C++,零基础,配图)
目录
🌈前言:
📁 高精度的概念
📁 高精度加法和其模板
📁 高精度减法和其模板
📁 高精度乘法和其模板
📁 高精度除法和其模板
📁 总结
🌈前言:
这篇文章主要是准备蓝桥杯竞赛同学所写,为你更好准备蓝桥杯比赛涉及的算法知识点。不知道你是否苦恼于不知算法从何学起,苦恼于网上资料稀少,或者复杂难懂,这篇文章就是帮助这部分同学的。下面整理了蓝桥杯考点大纲:
蓝桥杯考点大纲如果你对vecto数组r有兴趣,也可以阅读下面这篇文章,当然没了解vector数组也不影响阅读本篇文章
和C++STL中vector的初次见面,vector常见用法和操作(零基础/小白)-CSDN博客
上图是大学C组需要掌握的,对于B组的同学也是需要向下掌握的。本文主要是帮助蓝桥杯B/C为主体的大部分同学,所以讲解相对基础。本文是以C++为主要语言,但是C语言的同学也不需要担心,大部分语法是相通的,只不过是加了STL内容一个内容,也是会进行讲解的。
因为语法特性,变量等原因,对于JAVA,Python同学来说是不需要掌握高精度的。
同时本文将提供做题模板,方便你在考试中更好的做题,以及日常的刷题。
📁 高精度的概念
我们用C/C++创建变量时,变量类型是有取值范围的,对于最常用unsigned int来说,它最多有-2147483648 ~ 2147483647,即-(2^31)~(2^31-1),也就是说最多有31位, 那我们想存长度为10^6的数呢,这是我们就不能用C/C++语法规定的变量来存储了,我们就必须用数组来存储。
总结一下,高精度就是通过数组模拟四则运算来计算长度非常长的数字。
本文只讲解比较常见的四种高精度算法,如两个高精度数相加,两个高精度数相间,高精度数乘低精度数,高精度数除以低精度数。
通常来说,高精度灰常大,如10^6,低精度数10000以内。
对于高精度数这么多位数来说,我们首先想到的是整数数组来存储,可是有一个问题是存储呢是从后往前存储,还是从前往后存储?比如123,下标0是在1的位置,还是3的位置呢?
如果从1开始那么计算是否方便,很显然这是不方便的,如果感兴趣,可以自己尝试一下。可是对于从3开始存储,一开始我们怎么会知道他有多少位数呢?相信你一定知道数组还有一种叫做字符数组的,我们可以先将字符数字存储在字符数组中,再将字符数字逆序存储成整数数组中进行计算,这样大大减少了运算时进位的难度。(数组从前往后遍历如果遇到进位时,只需要下一个位置的数+1即可)
📁 高精度加法和其模板
我们首先来看一下,普通的加法怎么计算。
加法运算就是从个位开始相加,相加大于10就向前进1位,即向前一位+1。前面我们说了,高精度是通过数组来模拟计算的,如下图所示。
通过上图我们就可以得出模板:
vector<int> add(vector<int> A,vector<int> B)
{vector<int> C;int t = 0; //t是进位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;}
这里为了更好照顾C语言同学,讲解一下什么是vector<int> , 可以理解为数组,每个元素类型是int,即整数数组。
.size()可以理解为对数组的操作,求数组元素个数;.push_back()也是同理,向数组C插入元素的。
整体通读一遍模板代码,先创建数组C存储结果,当然是从个位先开始存储的。t是进位,如果Ai,Bi在i位置上有数,就加到t中,t就是相加结果,如果大于10,保留个位数,向前+1,t%10。
最后判断最大位数相加是否向前进1位,就是判断t,这里t只能取到0或者1。
以上,我们就对高精度加法模板有了了解,下面我们展示完整代码:
#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();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');vector<int> C = add(A, B);for (int i = C.size() - 1;i >= 0;i--)cout << C[i];return 0;
}
如果我们要使用vector数组的话,要引用头文件。
📁 高精度减法和其模板
A-B,我们要分两种情况,即A>=B,和 A < B;对于第1种情况,我们直接输出A-B即可,对于第二种情况我们输出 - (B - A);
对于模板,我们只需要确保A>=B即可。
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[i])t -= B[i];C.push_back((t + 10) % 10);if(t < 0)t = -1;elset = 0; }while(C.size() > 1 && C.back() == 0)C.pop_back();return C;
}
(t+10)%10,是为了保证减不开的情况,对于相减大于0的数不影响。
最后的while循环是为了保证一种情况,例如,127-120,在数组C中存储的是300,最后打印007了,所以我们要将前面两个0删去,当然如果是127-127,是要保留1个0的。
下面展示完整代码:
当然,我们下面还写了一个函数check,作用就是判断A是否大于等于B的。
#include <iostream>
#include <vector>using namespace std;bool check(vector<int> A, vector<int> B)
{if (A.size() > B.size())return true;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] + t;if (i < B.size())t -= B[i];C.push_back((t + 10) % 10);if (t < 0)t = -1;elset = 0;}while (C.size() > 1 && C.back() == 0)C.pop_back();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');if (check(A, B)){vector<int> C = sub(A, B);for (int i = C.size() - 1;i >= 0;i--)cout << C[i];}else{vector<int> C = sub(B, A);cout << '-';for (int i = C.size() - 1;i >= 0;i--)cout << C[i];}return 0;
}
📁 高精度乘法和其模板
下图便是高精度与低精度整数想乘的运算方式,将每一位数乘低精度数b + 上一位的进位,余数就是这位上的数,进位等于相除的结果。
得出模板为:
vector<int> mul(vector<int> A, int b)
{vector<int> C;int t = 0;for (int i = A.size() - 1;i >= 0 || 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;
}
当然最后还是要保证A*0的话只能有1个0。
下面展示完整代码:
#include <iostream>
#include <vector>using namespace std;vector<int> mul(vector<int> A, int b)
{vector<int> C;int t = 0;for (int i = A.size() - 1;i >= 0 || 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;cin >> a;int b;cin >> b;vector<int> A;for (int i = a.size() - 1;i >= 0;i--)A.push_back(a[i] - '0');vector<int> C = mul(A, b);for (int i = C.size() - 1;i >= 0;i--)cout << C[i];return 0;
}
📁 高精度除法和其模板
除法相对于上面三个有点不同,高精度数A是从最高位开始计算的,我们数组C存储也是从最高位开始存储,但是我们为了和上面保持一致,即输出都是从后往前输出,所以我们最后逆置数组。
这里为什么从0开始计算呢,是从1开始计算的,上一位的补下来是0,所以1/3=1,余数是1,,依次类推。理解了这里,高精度除法也就懂了。
下面展示模板:
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;
}
reverse()函数就是将数组元素逆置,其中begin(),end()你可以先简单理解为首元素位置,尾元素位置,将这两个参数传给reverse函数。函数是包含在头文件<algorithm>中
下面展示完整代码:
#include <iostream>
#include <vector>
#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;cin >> a;int b;cin >> b;vector<int> A;for (int i = a.size() - 1;i >= 0;i--)A.push_back(a[i] - '0');int r = 0;vector<int> C = div(A,b,r);for (int i = C.size() - 1;i >= 0;i--)cout << C[i];cout << endl << r << endl;return 0;
}
📁 总结
以上,我们就对高精度在蓝桥杯中的知识点进行了讲解,并针对性的讲解了例题,当然这也只是帮你更好的理解这些算法知识,想要学好算法,还需要不断地刷题练习,这里推荐到洛谷,acwing等网站进行练习,比如你看完了这篇文章,做回了例题习题,就可以上这些网站进行想应的练习。
如果你有哪里疑惑,欢迎在评论区留言,也欢迎大家指出文中错误。最后,希望大家在评论区积极讨论,点赞,收藏,关注ヾ(✿゚▽゚)ノ
相关文章:

蓝桥杯备赛 day 3 —— 高精度(C/C++,零基础,配图)
目录 🌈前言: 📁 高精度的概念 📁 高精度加法和其模板 📁 高精度减法和其模板 📁 高精度乘法和其模板 📁 高精度除法和其模板 📁 总结 🌈前言: 这篇文…...
人形机器人创新发展顶层设计与关键技术布局
系列文章目录 前言 随着新一轮科技革命和产业变革的深入推进,我国高度重视人形机器人的创新发展,提出了一系列具有前瞻性和战略性的指导意见。规划指出,到2025年,我国将初步建立人形机器人创新体系,攻克“大脑”、“小…...

C语言-算法-最小生成树
【模板】最小生成树 题目描述 如题,给出一个无向图,求出最小生成树,如果该图不连通,则输出 orz。 输入格式 第一行包含两个整数 N , M N,M N,M,表示该图共有 N N N 个结点和 M M M 条无向边。 接下来 M M M 行…...
android 扫描某个包下的所有类
注意事项 如果在用Android Studio开发过程中,如果新增了类,扫描不到。只能把APP卸载了,才能扫描到。 可能是Instance Run 的影响。 后面研究一下这篇文章,看看能不能解决 Android 遍历Apk下的所有类文件 package com.trs.nmip.…...
远程ssh 不通的原因之一
背景:我都想大喊一声,我上网是通的, ping网址是通的,ping www.baidu.com 是通的, 怎么都远程不了,报超时;嘿, 别人远程就能行。我都想挠头了。 目录 1. 先 ping 自己,…...

wamp集成环境部署
Windows下Apache服务器搭建 第一步:下载Windows下的最新ZIP压缩包 推荐下载网址:http://www.apachelounge.com/download/ 为了让Apache服务器发挥更好的性能,请根据自己的系统选择下载,如果不清楚自己的系统是64位还是32位&am…...
使用antd design pro 及后端nodejs express 结合minio进行文件的上传和下载管理
使用Ant Design Pro前端框架结合Node.js Express后端服务以及MinIO作为对象存储,实现文件上传和下载管理的基本步骤如下: 1. 安装所需依赖 在Node.js Express项目中安装minio客户端库: npm install minio --save 在前端项目(假…...

Unity常用的优化技巧集锦
Unity性能优化是面试的时候经常被问道的一些内容,今天给大家分享一些常用的Unity的优化技巧和思路,方便大家遇到问题时候参考与学习。 对啦!这里有个游戏开发交流小组里面聚集了一帮热爱学习游戏的零基础小白,也有一些正在从事游…...
c++动态调用dll
在C中动态调用DLL(动态链接库)可以使用Windows API函数。以下是一个简单的示例,演示如何动态加载和调用DLL中的函数: #include <windows.h> #include <iostream>int main() { // 加载DLL HMODULE hModule LoadLibrar…...

使用Python自动化操作手机,自动执行常见任务,例如滑动手势、呼叫、发送短信等等
使用Python自动化操作手机,自动执行常见任务,例如滑动手势、呼叫、发送短信等等。 此自动化脚本将帮助你使用 Python 中的 Android 调试桥 (ADB) 自动化你的智能手机。下面我将展示如何自动执行常见任务,例如滑动手势、呼叫、发送短信等等。 您可以了解有关 ADB 的更多信息,…...

E - Souvenir(图论典型例题)
思路:对于有很多询问的题,一般都是先初始化。我们求出每个点到其他点的最短路径以及相同路径下最大的价值和即可。 代码: #include <bits/stdc.h> #define pb push_back #define a first #define b second using namespace std; type…...

【SpringBoot篇】添加富文本编辑器操作
文章目录 🍔使用步骤⭐首先我们需要安装富文本编辑器⭐在<script>中引入富文本编辑器⭐富文本图片上传接口⭐初始化富文本编辑器⭐调用 初始化富文本编辑器的方法🎈新增🎈编辑🎈保存 ⭐添加按钮⭐实现viewEditor函数&#x…...

前台vue配置
前台 vue环境 1.傻瓜式安装node: 官网下载:https://nodejs.org/zh-cn/2.安装cnpm: >: npm install -g cnpm --registryhttps://registry.npm.taobao.org3.安装vue最新脚手架: >: cnpm install -g vue/cli注:如果2、3步报错,清除缓…...

牛客周赛 Round 18 解题报告 | 珂学家 | 分类讨论计数 + 状态DP
前言 整体评价 前三题蛮简单的,T4是一个带状态的DP,这题如果用背包思路去解,不知道如何搞,感觉有点头痛。所以最后还是选择状态DP来求解。 欢迎关注 珂朵莉 牛客周赛专栏 珂朵莉 牛客小白月赛专栏 A. 游游的整数翻转 这题最好…...
CentOS防火墙基本操作
CentOS操作系统中的防火墙可以使用firewalld或iptables来进行配置。 firewalld(默认): 查看当前状态:systemctl status firewalld 开启/关闭防火墙服务:sudo systemctl start/stop firewalld 设置开机自动启动/不启…...

Shell脚本的编程规范和变量类型
一. 了解编程 1.程序编程风格 面向过程语言 开发的时候 需要一步一步执行 问题规模小,可以步骤化,按部就班处理 以指令为中心,数据服务于指令 C,shell 面向对象语言 开发的时候 将任务当成一个整体 将编程看成是一个…...

C++面试:跳表
目录 跳表介绍 跳表的特点: 跳表的应用场景: C 代码示例: 跳表的特性 跳表示例 总结 跳表(Skip List)是一种支持快速搜索、插入和删除的数据结构,具有相对简单的实现和较高的查询性能。下面是跳表…...
掌握C++20的革命性特性:Concepts
掌握C20的革命性特性:Concepts C20 的新特性 C20 引入了 Concepts,这是一种用于限制类和函数模板的模板类型和非类型参数的命名要求。Concepts 是作为编译时评估的谓词,用于验证传递给模板的模板参数。Concepts 的主要目的是使模板相关的编…...

win11开机后频繁刷新桌面,任务栏不显示,文件资源管理器explorer报错ntdll.dll
win11 开机后桌面频繁刷新,cpu 暴涨,任务栏不出现。 不知道是安装了什么软件还是系统升级造成的,好长时间不重启电脑了,然后重启了下电脑。 结果就是: 现象描述 重启后 输入密码进入后 变得巨慢。好久才进入的桌面。…...

解决Git添加.gitignore文件后不生效的问题
1. 问题描述 如上图所示,在已存在.gitignore文件且已经提交过的Git管理的项目中,其中.class、.jar文件以及.idea目录内的内容全部都还是被Git管理了,可见.gitignore文件并没有生效。 2. 原因发现 .gitignore文件只能作用于 Untracked Files…...
Ubuntu系统下交叉编译openssl
一、参考资料 OpenSSL&&libcurl库的交叉编译 - hesetone - 博客园 二、准备工作 1. 编译环境 宿主机:Ubuntu 20.04.6 LTSHost:ARM32位交叉编译器:arm-linux-gnueabihf-gcc-11.1.0 2. 设置交叉编译工具链 在交叉编译之前&#x…...

【HarmonyOS 5.0】DevEco Testing:鸿蒙应用质量保障的终极武器
——全方位测试解决方案与代码实战 一、工具定位与核心能力 DevEco Testing是HarmonyOS官方推出的一体化测试平台,覆盖应用全生命周期测试需求,主要提供五大核心能力: 测试类型检测目标关键指标功能体验基…...
系统设计 --- MongoDB亿级数据查询优化策略
系统设计 --- MongoDB亿级数据查询分表策略 背景Solution --- 分表 背景 使用audit log实现Audi Trail功能 Audit Trail范围: 六个月数据量: 每秒5-7条audi log,共计7千万 – 1亿条数据需要实现全文检索按照时间倒序因为license问题,不能使用ELK只能使用…...
解决本地部署 SmolVLM2 大语言模型运行 flash-attn 报错
出现的问题 安装 flash-attn 会一直卡在 build 那一步或者运行报错 解决办法 是因为你安装的 flash-attn 版本没有对应上,所以报错,到 https://github.com/Dao-AILab/flash-attention/releases 下载对应版本,cu、torch、cp 的版本一定要对…...

【OSG学习笔记】Day 16: 骨骼动画与蒙皮(osgAnimation)
骨骼动画基础 骨骼动画是 3D 计算机图形中常用的技术,它通过以下两个主要组件实现角色动画。 骨骼系统 (Skeleton):由层级结构的骨头组成,类似于人体骨骼蒙皮 (Mesh Skinning):将模型网格顶点绑定到骨骼上,使骨骼移动…...

让AI看见世界:MCP协议与服务器的工作原理
让AI看见世界:MCP协议与服务器的工作原理 MCP(Model Context Protocol)是一种创新的通信协议,旨在让大型语言模型能够安全、高效地与外部资源进行交互。在AI技术快速发展的今天,MCP正成为连接AI与现实世界的重要桥梁。…...
Spring AI与Spring Modulith核心技术解析
Spring AI核心架构解析 Spring AI(https://spring.io/projects/spring-ai)作为Spring生态中的AI集成框架,其核心设计理念是通过模块化架构降低AI应用的开发复杂度。与Python生态中的LangChain/LlamaIndex等工具类似,但特别为多语…...
力扣-35.搜索插入位置
题目描述 给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 class Solution {public int searchInsert(int[] nums, …...

HashMap中的put方法执行流程(流程图)
1 put操作整体流程 HashMap 的 put 操作是其最核心的功能之一。在 JDK 1.8 及以后版本中,其主要逻辑封装在 putVal 这个内部方法中。整个过程大致如下: 初始判断与哈希计算: 首先,putVal 方法会检查当前的 table(也就…...
怎么让Comfyui导出的图像不包含工作流信息,
为了数据安全,让Comfyui导出的图像不包含工作流信息,导出的图像就不会拖到comfyui中加载出来工作流。 ComfyUI的目录下node.py 直接移除 pnginfo(推荐) 在 save_images 方法中,删除或注释掉所有与 metadata …...