文章目录

  • 前言
  • 一、高精度加法模板题
    • 1.题目要求
    • 2.题解
  • 二、高精度减法模板题
    • 1.题目要求
    • 2.题解
  • 三、高精度乘法模板题
    • 1.题目要求
    • 2.题解
  • 四、高精度除法模板题
    • 1.题目要求
    • 2.题解
  • 总结

前言

此系列博客为博主在AcWing算法基础课的学习笔记,不足之处欢迎批评指正,本文为高精度算法模板。
此次内容直接从题目出发。

一、高精度加法模板题

1.题目要求

给定两个正整数(不含前导 0),计算它们的和。

输入格式
共两行,每行包含一个整数。

输出格式
共一行,包含所求的和。

数据范围
1≤整数长度≤100000
输入样例:
12
23
输出样例:
35

2.题解

代码如下(示例):

#include <iostream>
#include <vector>using namespace std;vector<int> add(vector<int> &A, vector<int> &B)
{//确保传进来的数组A的长度更长if (A.size() < B.size()) return add(B, A);//C用来保存结果vector<int> C;//t用来表示进位,初始为0int t = 0;for (int i = 0; i < A.size(); i++){t += A[i];//B还有元素就加上B[i]if (i < B.size()) t += B[i];C.push_back(t % 10);t /= 10;}//要注意C也是反向存储的//运算完最后一位时,可能还需进一位,下面就是处理最后的进位if (t) C.push_back(t);return C;
}int main ()
{string a, b;vector<int> A, B;cin >> a >> b;//用两个vector数据来反向存储两个大整数,因为反向存储在有更高位出现的时候更易加到数组末尾//用数组正向存储大数据在有高位出现时所有地位都要向后移动,所以不推荐这样存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];cout << endl;return 0;
}

二、高精度减法模板题

1.题目要求

给定两个正整数(不含前导 0),计算它们的差,计算结果可能为负数。

输入格式
共两行,每行包含一个整数。

输出格式
共一行,包含所求的差。

数据范围
1≤整数长度≤105
输入样例:
32
11
输出样例:
21

2.题解

代码如下(示例):

#include <iostream>
#include <vector>using namespace std;bool cmp(vector<int> &A, vector<int> &B)
{if (A.size() != B.size()) return A.size() > B.size();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;for (int i = 0, t = 0; i < A.size(); i ++ ){//t表示是否被借位,初始为0t = A[i] - t;if (i < B.size()) t -= B[i];C.push_back((t + 10) % 10);if (t < 0) t = 1;else t = 0;}while (C.size() > 1 && C.back() == 0) C.pop_back();return C;
}int main()
{string a, b;vector<int> A, B;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');vector<int> C;//确保减数和被减数的大小关系if (cmp(A, B)) C = sub(A, B);else C = sub(B, A), cout << '-';for (int i = C.size() - 1; i >= 0; i -- ) cout << C[i];cout << endl;return 0;
}

三、高精度乘法模板题

1.题目要求

给定两个非负整数(不含前导 0) A 和 B,请你计算 A×B 的值。

输入格式
共两行,第一行包含整数 A,第二行包含整数 B。

输出格式
共一行,包含 A×B 的值。

数据范围
1≤A的长度≤100000,
0≤B≤10000
输入样例:
2
3
输出样例:
6

2.题解

代码如下(示例):

#include <iostream>
#include <vector>using namespace std;vector<int> mul(vector<int> &A, int b)
{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()
{//a为大数,用string来读,b不算大用int即可string a;int b;cin >> a >> b;vector<int> A;for (int i = a.size() - 1; i >= 0; i -- ) A.push_back(a[i] - '0');auto C = mul(A, b);for (int i = C.size() - 1; i >= 0; i -- ) printf("%d", C[i]);return 0;
}

四、高精度除法模板题

1.题目要求

给定两个非负整数(不含前导 0) A,B,请你计算 A/B 的商和余数。

输入格式
共两行,第一行包含整数 A,第二行包含整数 B。

输出格式
共两行,第一行输出所求的商,第二行输出所求余数。

数据范围
1≤A的长度≤100000,
1≤B≤10000,
B 一定不为 0
输入样例:
7
2
输出样例:
3
1

2.题解

代码如下(示例):

#include <iostream>
#include <vector>
#include <algorithm>using namespace std;vector<int> div(vector<int> &A, int b, int &r)
{vector<int> C;r = 0;// 除法是从最高位开始算的for (int i = A.size() - 1; i >= 0; i -- ){// 余数*10+当前这一位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;vector<int> A;int B;cin >> a >> B;for (int i = a.size() - 1; i >= 0; i -- ) A.push_back(a[i] - '0');int r;auto C = div(A, B, r);for (int i = C.size() - 1; i >= 0; i -- ) cout << C[i];cout << endl << r << endl;return 0;
}

总结

具体见代码注释,补充如下:
减 ’ 0 ’ 操作可以粗略的这样理解:字符 ’ 9 ’ - ’ 0 ’ = 9,把引号也“减”没了

高精度运算模板(高精度加减乘除)相关推荐

  1. 高精度运算模板(大数模板)

    现在还没学java..所以没法用java偷懒,先存一波C加加的大数运算模板,以备不时之需 补充:关于base参数的使用:代表字符串a和b都是在base进制下的数字,转换成10进制后进行运算后,返回的答 ...

  2. 高精度运算——加减乘除法模板

    一.高精度运算基本原理 高精度运算也称之为大数运算.即:在变量运算对象的数值范围为任何数据类型所无法容纳的情况下,采用整数数组存储(用字符串表示数字).高精度运算的难度并不大,考虑不清楚的话列个竖式模 ...

  3. 基础算法模板——高精度运算

    基础算法模板--高精度运算 1. 高精度加法 vector<int> add(vector<int> &A, vector<int> &B) {if ...

  4. float php 运算_系统的讲解 - PHP 浮点数高精度运算

    概述 记录下,工作中遇到的坑 ... 关于 PHP 浮点数运算,特别是金融行业.电子商务订单管理.数据报表等相关业务,利用浮点数进行加减乘除时,稍不留神运算结果就会出现偏差,轻则损失几十万,重则会有信 ...

  5. ZOJ 3447 Doraemon's Number Game(优先队列+高精度运算)

    Doraemon and Nobita are playing a number game. First, Doraemon will give Nobita Npositive numbers. T ...

  6. php 浮点精度,系统的讲解 - PHP 浮点数高精度运算

    概述 记录下,工作中遇到的坑 ... 关于 PHP 浮点数运算,特别是金融行业.电子商务订单管理.数据报表等相关业务,利用浮点数进行加减乘除时,稍不留神运算结果就会出现偏差,轻则损失几十万,重则会有信 ...

  7. 国王游戏(贪心算法+高精度运算)

    恰逢 H 国国庆,国王邀请 n 位大臣来玩一个有奖游戏. 首先,他让每个大臣在左.右手上面分别写下一个整数,国王自己也在左.右手上各写一个整数. 然后,让这 n 位大臣排成一排,国王站在队伍的最前面. ...

  8. 关于__int128高精度运算

    参考文章 使用__int128可以实现高精度运算,但是这种大整数无法使用函数printf输出结果,所以需要手写输出 #include <bits/stdc++.h> using names ...

  9. c语言用数组存储高精度数,高精度运算c语言.pptx

    <高精度运算c语言.pptx>由会员分享,可在线阅读,更多相关<高精度运算c语言.pptx(20页珍藏版)>请在人人文库网上搜索. 1.高精度运算,运算的前提条件:类型范围,确 ...

最新文章

  1. python正规教育机构-老男孩python教育机构|python该如何自学好?
  2. python绘制指数函数图像及性质_指数函数图像及其性质正式版
  3. divmod数字处理函数
  4. 【线上圆桌 - 263】视频会议终端到终端的加密
  5. 已知可生成0~4的rand5(),实现生成0~6的rand7()
  6. 介绍 Spring 3.1 M1 中的缓存功能
  7. video4linux 安装,【精品博文】Video4linux 下视频编程的流程
  8. Linux通过RPM方式指定软件安装目录
  9. VirtualBox+CentOS6.6安装增强功能包 - Building the main Guest Additions module [失败]
  10. php全选删除,php+ajax简单实现全选删除的方法
  11. 曝荣耀仍未获得谷歌Android授权;诋毁鸿蒙的OPPO员工离职;微信圈子将停止运营|极客头条...
  12. ktv管理系统_7天撸完KTV点歌系统,含后台管理系统(完整版)
  13. lwip netbuf
  14. select学习小demo--实现网页换肤
  15. Linux LVM动态扩容
  16. process.cwd()与__dirname的区别
  17. 串口监视软件_力控监控组态软件与西门子S7200
  18. 大数据实习生的年终总结,2022继续与CSDN同行
  19. 苏州大学计算机考研 复试机试真题2013-2020真题及Python题解
  20. DTC Sprint总结——管理经验篇

热门文章

  1. 两个互联网公司的创业故事
  2. [机缘参悟-73]:深度思考:心智提升的七个阶段
  3. 课程作业 哈利波特文章检索系统
  4. 飞书的故事,不止协同办公?
  5. htm显示日期与农历 html,获取当前日期和农历的js代码
  6. mysql slap_mysqlslap
  7. 基于WSL2+NVIDIA Docker的开发环境最佳实践
  8. TP-LINK TL-WR841N 路由变无线交换机设置
  9. ucGUI鼠标拖动实现(DockDrop实现)
  10. 在职计算机技术考研英语自我介绍,2019考研复试:英语自我介绍范文--在职考研...