C++高精度算法
文章结尾有惊喜
在 C++ 中,unsigned long long最大只能表示到2^64-1=18446744073709551615264−1=18446744073709551615
而有些题目需要用到更大的数,位数可能高达几十万,这时就需要用到我们今天所要讲解的高精度算法。
我们可以通过数组来模拟实现大数的运算。
1.1 读入大整数的方法
我们用一个数组来保存整个高精度整数,并记录高精度整数的长度len。
因为我们在模拟一个计算竖式的过程,需要从右往左读入以解决进位的问题。
string num;
cin >> num;
int a[105], len = num.size();
for (int i = 0; i < len; i++) {
a[i] = num[len - 1 - i] - '0';// 注意这里要减去'0',因为我们要把字符'0'变为整数"0"
}
1.2 输出大整数的方法
输出一个高精度的数就非常容易了,直接把数组中的元素倒序输出就可以了。
for (int i = len - 1; i >= 0; i--) {
cout << a[i];
}
1.3 高精度加高精度代码实现
#include <bits/stdc++.h>
using namespace std;
string num1, num2;
int a1[105], a2[105], len1, len2;
int main() {
cin >> num1 >> num2;
len1 = num1.size();
for (int i = 0; i < len1; i++) {
a1[i] = num1[len1 - 1 - i] - '0';
}
len2 = num2.size();
for (int i = 0; i < len2; i++) {
a2[i] = num2[len2 - 1 - i] - '0';
}
len1 = max(len1, len2);
for (int i = 0; i < len1; i++) {
a1[i] += a2[i];
}
for (int i = 0; i < len1; i++) {
a1[i + 1] += a1[i] / 10;
a1[i] %= 10;
}
while (a1[len1]) {
a1[len1 + 1] += a1[len1] / 10;
a1[len1] %= 10;
len1++;
}
for (int i = len1 - 1; i >= 0; i--) {
cout << a1[i];
}
return 0;
}
1.4 高精度减高精度代码实现
#include <bits/stedc++.h>
using namespace std;
string num1, num2;
int a1[105], a2[105], len1, len2;
bool sgn;
bool cmp(string a, string b) {
if (a.size() != b.size()) {
return a.size() < b.size();
}
return a < b;
}
int main() {
cin >> num1 >> num2;
if (cmp(num1, num2)) {
sgn = true;
swap(num1, num2);
}
len1 = num1.size();
for (int i = 0; i < len1; i++) {
a1[i] = num1[len1 - 1 - i] - '0';
}
len2 = num2.size();
for (int i = 0; i < len2; i++) {
a2[i] = num2[len2 - 1 - i] - '0';
}
for (int i = 0; i < len1; i++) {
a1[i] -= a2[i];
}
for (int i = 0; i < len1; i++) {
while (a1[i] < 0) {
a1[i + 1]--;
a1[i] += 10;
}
}
while (len1 > 1 && a1[len1 - 1] == 0) {
len1--;
}
if (sgn) {
cout << "-";
}
for (int i = len1 - 1; i >= 0; i--) {
cout << a1[i];
}
return 0;
}
1.5 高精度乘高精度代码实现
#include <bits/stdc++.h>
using namespace std;
string num1, num2;
int a1[105], a2[105], len1, len2, a[205], len;
int main() {
cin >> num1 >> num2;
len1 = num1.size();
for (int i = 0; i < len1; i++) {
a1[i] = num1[len1 - 1 - i] - '0';
}
len2 = num2.size();
for (int i = 0; i < len2; i++) {
a2[i] = num2[len2 - 1 - i] - '0';
}
for (int i = 0; i < len1; i++) {
for (int j = 0; j < len2; j++) {
a[i + j] += a1[i] * a2[j];
}
}
len = len1 + len2 - 1;
for (int i = 0; i < len; i++) {
a[i + 1] += a[i] / 10;
a[i] %= 10;
}
while (a[len]) {
a[len + 1] += a[len] / 10;
a[len] %= 10;
len++;
}
for (int i = len - 1; i >= 0; i--) {
cout << a[i];
}
return 0;
}
114514 <- 这是什么?
C++高精度算法的更多相关文章
- c++减法高精度算法
c++高精度算法,对于新手来说还是一大挑战,只要克服它,你就开启了编程的新篇章,算法. 我发的这个代码并不是很好,占用内存很多而且运行时间很长(不超过0.02秒),但是很好理解,很适合新手 高精算法的 ...
- c++加法高精度算法
c++高精度算法,对于新手来说还是一大挑战,只要克服它,你就开启了编程的新篇章,算法. 我发的这个代码并不是很好,占用内存很多而且运行时间很长(不超过1秒),但是很好理解,很适合新手 高精算法的本质就 ...
- 转载:C++之高精度算法
C++之高精度算法 注意:本文转载自http://blog.sina.com.cn/s/blog_4fdb102b010087ng.html,十分感谢原作者:忍者 前言:由于计算机运算是有模运算 ...
- 高精度算法(C/C++)
高精度算法 (C/C++) 做ACM题的时候,经常遇到大数的加减乘除,乘幂,阶乘的计算,这时给定的数据类型往往不够表示最后结果,这时就需要用到高精度算法.高精度算法的本质是把大数拆成若干固定长度的块, ...
- #AcWing系列课程Level-2笔记——5.高精度“+”算法
高精度"+"算法 编写高精度"+",记住下面的过程,代码也就游刃有余了! 1.首先我们要明白大整数是如何存储的? 2.其次存储完,如何运算? 高精度" ...
- LeetCode43,一题让你学会高精度算法
本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是LeetCode系列第22篇文章,今天讲的内容是高精度算法. 今天和大家讨论的算法是高精度,对应的LeetCode是第43题.题面其实 ...
- 【蓝桥杯C组】备赛基础篇之高精度算法
一.高精度加法 思路: 运用vector数组(c选手可用len来记录数组长度,数组去保存数字)将存入字符串里面的数字符倒叙保存,按照小学的加法列式,相加保存进位即可.具体参考代码. 详细代码解析: # ...
- 【洛谷】P1009 阶乘之和——高精度算法
题目描述 用高精度计算出S = 1! + 2! + 3! + - + n! ( n ≤ 50 ) S = 1! + 2! + 3! + - + n! ( n ≤ 50 ) 其中"!&qu ...
- [SinGuLaRiTy] 高精度算法代码库
[SinGuLaRiTy-1001] Copyrights (c) SinGuLaRiTy 2017. All Rights Reserved. 加法: #include<stdio.h> ...
- 证明最大公约数Stein算法(高精度算法)
E:even 奇数 O:odd 偶数 若(a,b)为(e,e),则gcd(a,b)=2*gcd(a/2,b/2) 若(a,b)为(e,o),则gcd(a,b)=gcd(a/2,b) 若(a,b)为( ...
随机推荐
- 基于Elasticsearch 为电商提供商品数据大数据查询
基于Elasticsearch 为电商提供商品数据大数据查询 前言 对于现代电商的产品,维度的多员花,与一套强大的搜索引擎,那是非常必要的.今天我们主要是描述我们在从事电商搜索引擎过程中的遇到的一些问 ...
- 前端分页组件简单好用列表分页page组件
快速实现 简单好用列表分页组件, 分页器组件,用于展示页码.请求数据等 ,包含翻页. 详情请访问uni-app插件市场地址:https://ext.dcloud.net.cn/plugin?id=12 ...
- git reset --hard 撤回后commit的代码消失了的解决办法
楼主在今天的工作中使用了这个命令 git reset --hard 撤回后commit的代码消失了,因为有commit,所以暂时得到了拯救,太不容易了,差点以为自己写的代码没了. 网上到处找帖子,看看 ...
- SQL SERVER 拼接字符串转化为表结构数据
本文为一些需要对特殊符号分隔的字符串进行解析,比如将 select '10,20,30,40,50,60' 这个字符串转化为一列多行 下面提供源代码: 1 SET QUOTED_IDENTIFIER ...
- JavaCV的摄像头实战之十三:年龄检测
欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos 本篇概览 本文是<JavaCV的摄像头实战> ...
- WAMP apache 无法运行 报错could not execult menu item
wamp:could not execult menu item (internal error)[exception]counld not perform service action:服务器没有及 ...
- XTTS系列之五:警惕大文件表空间
在上篇<XTTS系列之四:迷迷糊糊的并行度>验证之后,就让测试组在RMAN配置中设置好正确的并行.然后重新将备份任务执行,平均速度直接由之前的150MB/s提升为1200MB/s.优化效果 ...
- 本地数据local storage和session storage
随着互联网的快速发展,基于网页的应用越来越普遍,同时也变的越来越复杂,为了满足各种各样的需求,会经常性在本地存储大量的数据, HTML5规范提出了相关解决方案. 本地存储特性 1.数据存储在用户浏览器 ...
- 揭开 RocketMQ 事务消息的神秘面纱
事务消息是 RocketMQ 的高级特性之一,相信很多同学都对于其实现机制很好奇. 这篇文章,笔者会从应用场景.功能原理.实战例子.实现细节四个模块慢慢为你揭开事务消息的神秘面纱. 1 应用场景 以电 ...
- BUUCTF-Misc-荷兰宽带数据泄露(RouterPassView的使用)
题目 下载附件是一个bin文件 这里用的一个工具RouterPassView--路由器密码查看工具 路由器的备份文件通常包含了像您的ISP的用户名重要数据/密码,路由器的登录密码,无线网络的KEY. ...