一、高精度加法

思路:

运用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组】备赛基础篇之高精度算法的更多相关文章

  1. 【蓝桥杯C/C++组】备赛基础篇之差分算法

    一.个人理解 前面学习了前缀和算法,对于访问任意区间的速度是比较快的,但如果我们要修改某个区间的数呢,对于前缀和算法来说这还是有点棘手. 所以我们来学学新的算法:差分算法! 前缀和数组储存的是前n个数 ...

  2. 第十届蓝桥杯JavaB组省赛真题

    试题 A: 组队 本题总分:5 分 [问题描述] 作为篮球队教练,你需要从以下名单中选出 1 号位至 5 号位各一名球员, 组成球队的首发阵容. 每位球员担任 1 号位至 5 号位时的评分如下表所示. ...

  3. 第十届蓝桥杯JavaC组省赛真题

    试题 A: 求和 本题总分:5 分 [问题描述] 小明对数位中含有 2.0.1.9 的数字很感兴趣,在 1 到 40 中这样的数包 括 1.2.9.10 至 32.39 和 40,共 28 个,他们的 ...

  4. 第九届蓝桥杯JavaA组省赛真题

    解题代码部分来自网友,如果有不对的地方,欢迎各位大佬评论 题目1.分数 题目描述 1/1 + 1/2 + 1/4 + 1/8 + 1/16 + - 每项是前一项的一半,如果一共有20项, 求这个和是多 ...

  5. 第四届蓝桥杯JavaC组省赛真题

    解题代码部分来自网友,如果有不对的地方,欢迎各位大佬评论 题目1.猜年龄 题目描述 美国数学家维纳(N.Wiener)智力早熟,11岁就上了大学.他曾在1935~1936年应邀来中国清华大学讲学. 一 ...

  6. 第九届蓝桥杯JavaB组省赛真题

    解题代码部分来自网友,如果有不对的地方,欢迎各位大佬评论 题目1.第几天 题目描述 2000年的1月1日,是那一年的第1天. 那么,2000年的5月4日,是那一年的第几天? 注意:需要提交的是一个整数 ...

  7. Java实现第十一届蓝桥杯JavaB组 省赛真题

    试题 A: 指数计算 本题总分:5 分 [问题描述] 7 月 1 日是建党日,从 1921 年到 2020 年, 已经带领中国人民 走过了 99 年. 请计算:7 ^ 2020 mod 1921,其中 ...

  8. 第八届蓝桥杯JavaB组省赛真题

    解题代码部分来自网友,如果有不对的地方,欢迎各位大佬评论 题目1.购物单 题目描述 小明刚刚找到工作,老板人很好,只是老板夫人很爱购物.老板忙的时候经常让小明帮忙到商场代为购物.小明很厌烦,但又不好推 ...

  9. 第九届蓝桥杯JavaC组省赛真题

    解题代码部分来自网友,如果有不对的地方,欢迎各位大佬评论 题目1.哪天返回 题目描述 小明被不明势力劫持.后被扔到x星站再无问津.小明得知每天都有飞船飞往地球,但需要108元的船票,而他却身无分文. ...

随机推荐

  1. php+mysql数据库联合查询 left join 右侧数据重复问题

    情况:多表联合查询(三表及以上联合查询) 分析: A left join B left join C left join D 假如: 表B.C.D都与表A关联查询 A left join B 4条数据 ...

  2. webpack 中常用安装插件的一些命令

    1:npm install html-webpack-plugin --save-dev //自动快速的帮我们生成HTML.2:npm install css-loader style-loader  ...

  3. linux之cat 操作

    1.查看或创建 cat 1.txt #如果目录有这个文件则会打开查看,没有则会创建 2.压缩空白 cat 1.txt 我是第一行 我是第二 行 cat -bs 1.txt # 变成 cat 1.txt ...

  4. [GO] mac安装GO 初次尝试

    其实试了好多方法,我用的是下面这种方法,简单快捷! 安装homebrew 在终端输入命令 ruby -e "$(curl -fsSL https://raw.githubuserconten ...

  5. Soul Android app 悬浮view以及帖子中view的联动刷新逆向分析

    Soul app是我司的竞品,对它的语音音乐播放同步联动的逻辑很感兴趣,于是就开启了一波逆向分析. 下面看代码,以及技术分析,直接步入正轨,哈哈. 我们根据https://github.com/xin ...

  6. Ubuntu安装Python3.8及新特性

    Ubuntu安装Python3.8.0a4 如果你想体验一下,请用虚拟机(感受一下就行,别当真). 新特性(整体来说,有三点特别需要注意一下) 海象运算符 # python3.7 a = '123' ...

  7. PHP中的11个魔术方法

    1.__get.__set 这两个方法是为在类和他们的父类中没有声明的属性而设计的 __get( $property )       当调用一个未定义的属性时访问此方法__set( $property ...

  8. php的echo 和 return的区别

    来源:https://blog.csdn.net/ljfphp/article/details/76718635 项目中碰到的问题,本来是想在控制器直接return $xml的($xml是一段xml格 ...

  9. 20199308《Linux内核原理与分析》第十一周作业

    缓冲区溢出漏洞实验 实验步骤 一.初始设置 1.Ubuntu 和其他一些 Linux 系统中,使用地址空间随机化来随机堆(heap)和栈(stack)的初始地址,这使得猜测准确的内存地址变得十分困难, ...

  10. 自定义parallelStream的thread pool

    目录 简介 通常操作 使用自定义ForkJoinPool 总结 自定义parallelStream的thread pool 简介 之前我们讲到parallelStream的底层使用到了ForkJoin ...