高精度运算模板(高精度加减乘除)
文章目录
- 前言
- 一、高精度加法模板题
- 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,把引号也“减”没了
高精度运算模板(高精度加减乘除)相关推荐
- 高精度运算模板(大数模板)
现在还没学java..所以没法用java偷懒,先存一波C加加的大数运算模板,以备不时之需 补充:关于base参数的使用:代表字符串a和b都是在base进制下的数字,转换成10进制后进行运算后,返回的答 ...
- 高精度运算——加减乘除法模板
一.高精度运算基本原理 高精度运算也称之为大数运算.即:在变量运算对象的数值范围为任何数据类型所无法容纳的情况下,采用整数数组存储(用字符串表示数字).高精度运算的难度并不大,考虑不清楚的话列个竖式模 ...
- 基础算法模板——高精度运算
基础算法模板--高精度运算 1. 高精度加法 vector<int> add(vector<int> &A, vector<int> &B) {if ...
- float php 运算_系统的讲解 - PHP 浮点数高精度运算
概述 记录下,工作中遇到的坑 ... 关于 PHP 浮点数运算,特别是金融行业.电子商务订单管理.数据报表等相关业务,利用浮点数进行加减乘除时,稍不留神运算结果就会出现偏差,轻则损失几十万,重则会有信 ...
- ZOJ 3447 Doraemon's Number Game(优先队列+高精度运算)
Doraemon and Nobita are playing a number game. First, Doraemon will give Nobita Npositive numbers. T ...
- php 浮点精度,系统的讲解 - PHP 浮点数高精度运算
概述 记录下,工作中遇到的坑 ... 关于 PHP 浮点数运算,特别是金融行业.电子商务订单管理.数据报表等相关业务,利用浮点数进行加减乘除时,稍不留神运算结果就会出现偏差,轻则损失几十万,重则会有信 ...
- 国王游戏(贪心算法+高精度运算)
恰逢 H 国国庆,国王邀请 n 位大臣来玩一个有奖游戏. 首先,他让每个大臣在左.右手上面分别写下一个整数,国王自己也在左.右手上各写一个整数. 然后,让这 n 位大臣排成一排,国王站在队伍的最前面. ...
- 关于__int128高精度运算
参考文章 使用__int128可以实现高精度运算,但是这种大整数无法使用函数printf输出结果,所以需要手写输出 #include <bits/stdc++.h> using names ...
- c语言用数组存储高精度数,高精度运算c语言.pptx
<高精度运算c语言.pptx>由会员分享,可在线阅读,更多相关<高精度运算c语言.pptx(20页珍藏版)>请在人人文库网上搜索. 1.高精度运算,运算的前提条件:类型范围,确 ...
最新文章
- python正规教育机构-老男孩python教育机构|python该如何自学好?
- python绘制指数函数图像及性质_指数函数图像及其性质正式版
- divmod数字处理函数
- 【线上圆桌 - 263】视频会议终端到终端的加密
- 已知可生成0~4的rand5(),实现生成0~6的rand7()
- 介绍 Spring 3.1 M1 中的缓存功能
- video4linux 安装,【精品博文】Video4linux 下视频编程的流程
- Linux通过RPM方式指定软件安装目录
- VirtualBox+CentOS6.6安装增强功能包 - Building the main Guest Additions module [失败]
- php全选删除,php+ajax简单实现全选删除的方法
- 曝荣耀仍未获得谷歌Android授权;诋毁鸿蒙的OPPO员工离职;微信圈子将停止运营|极客头条...
- ktv管理系统_7天撸完KTV点歌系统,含后台管理系统(完整版)
- lwip netbuf
- select学习小demo--实现网页换肤
- Linux LVM动态扩容
- process.cwd()与__dirname的区别
- 串口监视软件_力控监控组态软件与西门子S7200
- 大数据实习生的年终总结,2022继续与CSDN同行
- 苏州大学计算机考研 复试机试真题2013-2020真题及Python题解
- DTC Sprint总结——管理经验篇
热门文章
- 两个互联网公司的创业故事
- [机缘参悟-73]:深度思考:心智提升的七个阶段
- 课程作业 哈利波特文章检索系统
- 飞书的故事,不止协同办公?
- htm显示日期与农历 html,获取当前日期和农历的js代码
- mysql slap_mysqlslap
- 基于WSL2+NVIDIA Docker的开发环境最佳实践
- TP-LINK TL-WR841N 路由变无线交换机设置
- ucGUI鼠标拖动实现(DockDrop实现)
- 在职计算机技术考研英语自我介绍,2019考研复试:英语自我介绍范文--在职考研...