【蓝桥杯C组】备赛基础篇之高精度算法
一、高精度加法
思路:
运用vector数组(c选手可用len来记录数组长度,数组去保存数字)将存入字符串里面的数字符倒叙保存,按照小学的加法列式,相加保存进位即可。具体参考代码。
详细代码解析:
- #include<iostream>
- #include<string>
- #include<vector>
- using namespace std;
- //数据名称太长后面又要经常用到它,所以直接给他取个小名,就相当于c中的define
- typedef vector<int> vi;
- vi add(vi& a, vi& b) {
- vi c;//存结果的数组
- for (int i = , t = ;i < a.size() || i < b.size() || t;i++) {
- //加法就是让所有的数字加到没有为止;还有保存进位的要储存到c中。
- if (i < a.size()) t += a[i];
- if (i < b.size()) t += b[i];
- c.push_back(t % );
- //每次存储个位,这也就解释了为什么限制条件要加一个t!=0,因为可能两个数字都加完了,还有进位的数字没有加进去。
- t /= ;
- }
- return c;
- }
- int main() {
- vi a, b, c;
- string str1, str2;
- cin >> str1 >> str2;
- //倒序保存,注意字符与数字之间的转换。
- for (int i = str1.size() - ;i >= ;i--) a.push_back(str1[i] - '');
- for (int i = str2.size() - ;i >= ;i--) b.push_back(str2[i] - '');
- c = add(a, b);
- //倒序输出
- for (int i = c.size() - ;i >= ;i--) cout << c[i];
- return ;
- }
二、高精度减法
思路:
运用竖式减法,大的减小的,小的减大的需要转换成大的减小的再天上负号;减不过就向后一个借1。
详细代码解析:
- #include<iostream>
- #include<string>
- #include<vector>
- using namespace std;
- //数据名称太长后面又要经常用到它,所以直接给他取个小名,就相当于c中的define
- typedef vector<int> vi;
- bool cmp(vi& a, vi& b) {
- //比较位数,位数大的数值肯定大。
- if (a.size() != b.size()) return a.size() > b.size();
- //位数相同,从高位往低位比较每个位置的数值。
- for (int i = a.size() - ;i >= ;i--)
- if (a[i] != b[i]) return a[i] > b[i];
- return true;
- }
- void sub(vi& a, vi& b, vi& c) {
- for (int i = , t = ;i < a.size();i++) {
- //a是大的数字,所以以a的位数作为结束
- t += a[i];
- //看看是否需要-1,前方的数值有木有借位。
- if (i < b.size()) t -= b[i];
- //看看是否还有b,有的话就相减
- //没有的话直接存入位数中。
- c.push_back((t + ) % );
- //加10模10防止a[i]小了,不够,减成了负号
- if (t < ) t = -;
- //t带了负号,说明借了位,变为-1记录借了位。
- else t = ;
- //不是负号,初始化为0,什么事也没发生。
- }
- while (c.size() > && !c.back()) c.pop_back();
- //去掉前置零。
- }
- int main() {
- string str1, str2;
- vi a, b, c;
- cin >> str1 >> str2;
- //倒序保存
- for (int i = str1.size() - ;i >= ;i--) a.push_back(str1[i] - '');
- for (int i = str2.size() - ;i >= ;i--) b.push_back(str2[i] - '');
- if (cmp(a, b)) sub(a, b, c);
- //减不过,就只能添负号,让b-a。
- else sub(b, a, c), cout << "-";
- //倒序输出
- for (int i = c.size() - ;i >= ;i--) cout << c[i];
- return ;
- }
三、高精度乘法
思路:
运用竖式法则的算法,由于这个算法是高精度乘以低精度,所以不用一个一个的乘,只需让高精度中的每一个数乘以整个低精度就行。
详细代码解析:
- #include<iostream>
- #include<string>
- #include<vector>
- using namespace std;
- typedef vector<int> vi;
- vi mul(vi& a, int& b) {
- vi c;
- for (int i = , t = ;i < a.size() || t;i++) {
- if (i < a.size()) t += a[i] * b;
- c.push_back(t % );
- t /= ;
- }
- //处理前置零
- while (c.size() > && !c.back()) c.pop_back();
- return c;
- }
- int main() {
- string str;
- int b;
- vi a, c;
- cin >> str >> b;
- //倒序存储
- for (int i = str.size() - ;i >= ;i--) a.push_back(str[i] - '');
- c = mul(a, b);
- //倒序输出
- for (int i = c.size() - ;i >= ;i--) cout << c[i];
- return ;
- }
四、高精度除法
思路:
标准除法运算,适合于 高/低 。
详细代码解析:
- #include<iostream>
- #include<vector>
- #include<string>
- #include<algorithm>
- using namespace std;
- typedef vector<int> vi;
- vi div(vi& a, int& b, int& r) {
- vi c;
- //由于除法是从高位开始计算,所以我们要倒序访问
- for (int i = a.size() - ;i >= ;i--) {
- r = r * + a[i];//余数乘10+下一位数
- c.push_back(r / b);
- r %= b;//余数2取模
- }
- //由于倒序访问,存储的结果也就是正序的,我们为了将其统一保存格式,所以要将他反过来。
- //统一格式的话便于将四则运算联合起来用。
- reverse(c.begin(), c.end());
- while (c.size() > && !c.back()) c.pop_back();
- return c;
- }
- int main() {
- int b, r = ;
- string str;
- vi a, c;
- cin >> str >> b;
- for (int i = str.size() - ;i >= ;i--) a.push_back(str[i] - '');
- c = div(a, b, r);
- for (int i = c.size() - ;i >= ;i--) cout << c[i];
- cout << endl << r << endl;
- return ;
- }
高精度算法在历年蓝桥杯中出现过,所以要掌握。
【蓝桥杯C组】备赛基础篇之高精度算法的更多相关文章
- 【蓝桥杯C/C++组】备赛基础篇之差分算法
一.个人理解 前面学习了前缀和算法,对于访问任意区间的速度是比较快的,但如果我们要修改某个区间的数呢,对于前缀和算法来说这还是有点棘手. 所以我们来学学新的算法:差分算法! 前缀和数组储存的是前n个数 ...
- 第十届蓝桥杯JavaB组省赛真题
试题 A: 组队 本题总分:5 分 [问题描述] 作为篮球队教练,你需要从以下名单中选出 1 号位至 5 号位各一名球员, 组成球队的首发阵容. 每位球员担任 1 号位至 5 号位时的评分如下表所示. ...
- 第十届蓝桥杯JavaC组省赛真题
试题 A: 求和 本题总分:5 分 [问题描述] 小明对数位中含有 2.0.1.9 的数字很感兴趣,在 1 到 40 中这样的数包 括 1.2.9.10 至 32.39 和 40,共 28 个,他们的 ...
- 第九届蓝桥杯JavaA组省赛真题
解题代码部分来自网友,如果有不对的地方,欢迎各位大佬评论 题目1.分数 题目描述 1/1 + 1/2 + 1/4 + 1/8 + 1/16 + - 每项是前一项的一半,如果一共有20项, 求这个和是多 ...
- 第四届蓝桥杯JavaC组省赛真题
解题代码部分来自网友,如果有不对的地方,欢迎各位大佬评论 题目1.猜年龄 题目描述 美国数学家维纳(N.Wiener)智力早熟,11岁就上了大学.他曾在1935~1936年应邀来中国清华大学讲学. 一 ...
- 第九届蓝桥杯JavaB组省赛真题
解题代码部分来自网友,如果有不对的地方,欢迎各位大佬评论 题目1.第几天 题目描述 2000年的1月1日,是那一年的第1天. 那么,2000年的5月4日,是那一年的第几天? 注意:需要提交的是一个整数 ...
- Java实现第十一届蓝桥杯JavaB组 省赛真题
试题 A: 指数计算 本题总分:5 分 [问题描述] 7 月 1 日是建党日,从 1921 年到 2020 年, 已经带领中国人民 走过了 99 年. 请计算:7 ^ 2020 mod 1921,其中 ...
- 第八届蓝桥杯JavaB组省赛真题
解题代码部分来自网友,如果有不对的地方,欢迎各位大佬评论 题目1.购物单 题目描述 小明刚刚找到工作,老板人很好,只是老板夫人很爱购物.老板忙的时候经常让小明帮忙到商场代为购物.小明很厌烦,但又不好推 ...
- 第九届蓝桥杯JavaC组省赛真题
解题代码部分来自网友,如果有不对的地方,欢迎各位大佬评论 题目1.哪天返回 题目描述 小明被不明势力劫持.后被扔到x星站再无问津.小明得知每天都有飞船飞往地球,但需要108元的船票,而他却身无分文. ...
随机推荐
- vue2.x学习笔记(八)
接着前面的内容:https://www.cnblogs.com/yanggb/p/12577433.html. 列表渲染 vue提供了一个[v-for]指令用于列表渲染(循环). 用[v-for]指令 ...
- sftp的用法
linux sftp远程连接命令 sftp -oPort=60001 root@192.168.0.254 使用-o选项来指定端口号. -oPort=远程端口号 sftp> get /var/w ...
- wechall前十题
今天开始打一打wechall 累了打wechall,不累的时候开始打buu 第一题:Get Sourced 查看源代码即可,拉到底部 第二题:Stegano 属于misc的范畴,直接下载下来,然后no ...
- #4018. 统计n! 尾部零
题目出处: http://www.51cpc.com/problem/4018 题目描述 试统计正整数n的阶乘n!=1×2×3×…×n尾部连续零的个数. 输入格式 输入正整数n 输出格式 输出个数 样 ...
- HTML+CSS教程(三)marquee滚动效果
一.marquee 1.marquee标签的属性scrollHeight:获取对象的滚动高度.scrollLeft:设置或获取位于对象左边界和窗口中目前可见内容的最左端之间的距离.scrollTop: ...
- go的 三个点 ...
这三个点,比较任性,可前可后,可攻可守... 举2个栗子: 1.func sub(arg ...int) (total int){} 2.argsArr = apend(argsArr[:3], ar ...
- 详解封装源码包成RPM包
源码编译安装是最常用安装软件方式,可是面对工作量巨大时候就需要我们的RPM包上场了,统一的模块,一键安装.在面对一定数量的服务器上,RPM就可以为我们节省大量的时间. RPM可以在网上下载,但是当我们 ...
- cocos2dx初体验
我们创建工程后总会自带一个HelloWorld类,短短的几行代码就出来了一个游戏的雏形,请问我们真的理解它了吗?如果我们能早一点弄明白这几行代码,我们或许会比现在走得更远. 理解HelloWorld类 ...
- PIL库的学习总结及生成GIF
一.PIL库的概述 PIL(Python Image Library)库是Python语言的第三方库,需要通过pip工具安装. 打开cmd,输入 pip install pillow PIL库支持图像 ...
- 小米Note 10 Lite海外发布 无缘中国市场
[TechWeb]5月1日消息,昨日晚间,小米Note 10 Lite在海外亮相.小米市场部副总经理臧智渊在微博透露,小米Note 10 Lite 6GB+64GB版售价349欧元(约合人民币2700 ...