蓝桥杯备赛 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等网站进行练习,比如你看完了这篇文章,做回了例题习题,就可以上这些网站进行想应的练习。

        如果你有哪里疑惑,欢迎在评论区留言,也欢迎大家指出文中错误。最后,希望大家在评论区积极讨论,点赞,收藏,关注ヾ(✿゚▽゚)ノ

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

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

相关文章

设计一个网页爬虫

定义 User Case 和 约束 注意&#xff1a;没有一个面试官会阐述清楚问题&#xff0c;我们需要定义Use case和约束 Use cases 我们的作用域只是处理以下Use Case&#xff1a; Service 爬取一批 url 生成包含搜索词的单词到页面的反向索引给页面生成标题和片段– 标题和片段是…

迅为RK3588开发板编译 Buildroot单独编译图形化界面(打包镜像)

上面 Kernel/U-Boot/Recovery/Rootfs 各个部分的编译后&#xff0c;将打包要用到的所有固件移动到 rockdev 目录下&#xff0c;然后打包为完整的 update.img 镜像。 首先在 linux 源码目录下输入以下命令进入编译的 UI 界面&#xff0c;进入之后如下所示&#xff1a; ./buil…

gin+gorm增删改查目录框架

从网上找资料,发现,很多都是直接的结构 路由&#xff0c;后端的controller层&#xff0c;还有model层&#xff0c;都是放在了同一个main.go文件中&#xff0c;如果写项目的话&#xff0c;还得自己去拆文件&#xff0c;拆代码&#xff0c;经过查询和自己总结&#xff0c;下面放…

鸿蒙开发(四)UIAbility和Page交互

通过上一篇的学习&#xff0c;相信大家对UIAbility已经有了初步的认知。在上篇中&#xff0c;我们最后实现了一个小demo&#xff0c;从一个UIAbility调起了另外一个UIAbility。当时我提到过&#xff0c;暂不实现比如点击EntryAbility中的控件去触发跳转&#xff0c;而是在Entry…

vue 指定区域可拖拽的限定拖拽区域的div(如仅弹窗标题可拖拽的弹窗)

<template><div class"container" ref"container"><div class"drag-box" v-drag><div class"win_head">弹窗标题</div><div class"win_content">弹窗内容</div></div><…

pycharm import torch

目录 1 安装 2 conda环境配置 3 测试 开始学习Pytorch! 1 安装 我的电脑 Windows 11 Python 3.11 Anaconda3-2023.09-0-Windows-x86_64.exe cuda_11.8.0_522.06_windows.exe pytorch &#xff08;管理员命令行安装&#xff09; pycharm-community-2023.3.2.exe 2 c…

白山云基于StarRocks数据库构建湖仓一体数仓的实践

背景 随着每天万亿级别的业务数据流向数据湖&#xff0c;数据湖的弊端也逐渐凸显出来&#xff0c;例如&#xff1a; 数据入湖时效性差&#xff1a;数据湖主要依赖于离线批量计算&#xff0c;通常不支持实时数据更新&#xff0c;因此无法保证数据的强一致性&#xff0c;造成数…

js的防抖与节流

目录 认识防抖与节流防抖节流 手写防抖函数绑定this与参数取消功能立即执行获取返回值最终版 手写节流函数 认识防抖与节流 在JavaScript中&#xff0c;大量操作都会触发事件&#xff0c;这些事件又会被添加到事件队列中进行排队处理 某些事件如果频繁触发的话会对浏览器的性能…

HarmonyOS —— buildMode 设置(对比 Android Build Varient)

前言 在安卓中 Build Variant 主要依赖模块&#xff08;module&#xff09;中 build.gradle 的 BuildType 和 ProductFlavor 提供的属性和方法&#xff0c;我们可以使用 Build Type 可以配置不同的构建方式、ProductFlavor 主要用来进行多渠道打包。 在鸿蒙中要做到同样像效果…

计算机网络——第四层:传输层以及TCP UDP

1. 传输层的协议 1.1 TCP (传输控制协议) - rfc793 连接模式的传输。 保证按顺序传送数据包。 流量控制、错误检测和在数据包丢失时的重传。 用于需要可靠传输的应用&#xff0c;如网络&#xff08;HTTP/HTTPS&#xff09;、电子邮件&#xff08;SMTP, IMAP, POP3&#xff09;…

阿里云服务器4核8G配置最新优惠价格表(2024活动报价)

阿里云服务器4核8g配置云服务器u1价格是955.58元一年&#xff0c;4核8G配置还可以选择ECS计算型c7实例、计算型c8i实例、计算平衡增强型c6e、ECS经济型e实例、AMD计算型c8a等机型等ECS实例规格&#xff0c;规格不同性能不同&#xff0c;价格也不同&#xff0c;阿里云服务器网al…

uniapp uni.chooseLocation调用走失败那里,错误码:112

问题&#xff1a;我配置了百度上所有能配置的&#xff0c;一直调用不成功&#xff0c;如下图配置的 1:第一个 配置 代码&#xff1a; "permission": {"scope.userLocation": {"desc": "你的位置信息将用于小程序位置接口的效果展示"}…

C语言数据结构之线性表-顺序表篇

星光不负赶路人 江河眷顾奋楫者 &#x1f3a5;烟雨长虹&#xff0c;孤鹜齐飞的个人主页 &#x1f525;个人专栏 期待小伙伴们的支持与关注&#xff01;&#xff01;&#xff01; 线性表的简介# 线性表&#xff08;linearlist&#xff09;&#xff1a;是n个具有相同特性的数据元…

css实现动态水波纹效果

效果如下&#xff1a; 外层容器 (shop_wrap)&#xff1a; 设置外边距 (padding) 提供一些间距和边距 圆形容器 (TheCircle)&#xff1a; 使用相对定位 (position: relative)&#xff0c;宽度和高度均为 180px&#xff0c;形成一个圆形按钮圆角半径 (border-radius) 设置为 50%&…

面试题 05.06. 整数转换(力扣)(OJ题)

题目链接&#xff1a;面试题 05.06. 整数转换 - 力扣&#xff08;LeetCode&#xff09; 所属专栏&#xff1a;刷题 整数转换。编写一个函数&#xff0c;确定需要改变几个位才能将整数A转成整数B。 示例1: 输入&#xff1a;A 29 &#xff08;或者0b11101&#xff09;, B 15…

5-微信小程序语法参考

1. 数据绑定 官网传送门 WXML 中的动态数据均来自对应 Page 的 data。 数据绑定使用 Mustache 语法&#xff08;双大括号&#xff09;将变量包起来 ts Page({data: {info: hello wechart!,msgList: [{ msg: hello }, { msg: wechart }]}, })WXML <view class"vie…

搜索与图论第四期 树与图的广度优先遍历(例题)

例题&#xff1a;快速排序模板&#xff1a; AC代码&#xff1a; 源码&#xff1a; #include <iostream> using namespace std; const int N 1e6 10; int n; int q[N];void quick_sort(int q[], int l, int r) {if (l > r)return ;int x q[l], i l - 1, j r 1…

经典目标检测YOLO系列(二)YOLOV2的复现(1)总体网络架构及前向推理过程

经典目标检测YOLO系列(二)YOLOV2的复现(1)总体网络架构及前向推理过程 和之前实现的YOLOv1一样&#xff0c;根据《YOLO目标检测》(ISBN:9787115627094)一书&#xff0c;在不脱离YOLOv2的大部分核心理念的前提下&#xff0c;重构一款较新的YOLOv2检测器&#xff0c;来对YOLOV2有…

压力测试+接口测试(工具jmeter)

jmeter是apache公司基于java开发的一款开源压力测试工具&#xff0c;体积小&#xff0c;功能全&#xff0c;使用方便&#xff0c;是一个比较轻量级的测试工具&#xff0c;使用起来非常简单。因 为jmeter是java开发的&#xff0c;所以运行的时候必须先要安装jdk才可以。jmeter是…

【论文阅读】Deep Graph Contrastive Representation Learning

目录 0、基本信息1、研究动机2、创新点3、方法论3.1、整体框架及算法流程3.2、Corruption函数的具体实现3.2.1、删除边&#xff08;RE&#xff09;3.2.2、特征掩盖&#xff08;MF&#xff09; 3.3、[编码器](https://blog.csdn.net/qq_44426403/article/details/135443921)的设…