文章结尾有惊喜

在 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++高精度算法的更多相关文章

  1. c++减法高精度算法

    c++高精度算法,对于新手来说还是一大挑战,只要克服它,你就开启了编程的新篇章,算法. 我发的这个代码并不是很好,占用内存很多而且运行时间很长(不超过0.02秒),但是很好理解,很适合新手 高精算法的 ...

  2. c++加法高精度算法

    c++高精度算法,对于新手来说还是一大挑战,只要克服它,你就开启了编程的新篇章,算法. 我发的这个代码并不是很好,占用内存很多而且运行时间很长(不超过1秒),但是很好理解,很适合新手 高精算法的本质就 ...

  3. 转载:C++之高精度算法

    C++之高精度算法 注意:本文转载自http://blog.sina.com.cn/s/blog_4fdb102b010087ng.html,十分感谢原作者:忍者    前言:由于计算机运算是有模运算 ...

  4. 高精度算法(C/C++)

    高精度算法 (C/C++) 做ACM题的时候,经常遇到大数的加减乘除,乘幂,阶乘的计算,这时给定的数据类型往往不够表示最后结果,这时就需要用到高精度算法.高精度算法的本质是把大数拆成若干固定长度的块, ...

  5. #AcWing系列课程Level-2笔记——5.高精度“+”算法

    高精度"+"算法 编写高精度"+",记住下面的过程,代码也就游刃有余了! 1.首先我们要明白大整数是如何存储的? 2.其次存储完,如何运算? 高精度" ...

  6. LeetCode43,一题让你学会高精度算法

    本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是LeetCode系列第22篇文章,今天讲的内容是高精度算法. 今天和大家讨论的算法是高精度,对应的LeetCode是第43题.题面其实 ...

  7. 【蓝桥杯C组】备赛基础篇之高精度算法

    一.高精度加法 思路: 运用vector数组(c选手可用len来记录数组长度,数组去保存数字)将存入字符串里面的数字符倒叙保存,按照小学的加法列式,相加保存进位即可.具体参考代码. 详细代码解析: # ...

  8. 【洛谷】P1009 阶乘之和——高精度算法

    题目描述 用高精度计算出S = 1! + 2! + 3! + - + n!  ( n ≤  50 ) S = 1! + 2! + 3! + - + n! ( n ≤ 50 ) 其中"!&qu ...

  9. [SinGuLaRiTy] 高精度算法代码库

    [SinGuLaRiTy-1001] Copyrights (c) SinGuLaRiTy 2017. All Rights Reserved. 加法: #include<stdio.h> ...

  10. 证明最大公约数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)为( ...

随机推荐

  1. spark连接mysql数据库

    1.安装启动检查Mysql服务.netstat -tunlp (3306) 2.spark 连接mysql驱动程序. –cp /usr/local/hive/lib/mysql-connector-j ...

  2. [QML]事无巨细开始实践QML开发(一)什么是QML,为什么学习QML,先写一个简单的页面

    [QML]从零开始QML开发(一)什么是QML,为什么学习QML,先写一个简单的页面 QML开发和QWidget开发的区别 QML(Qt Meta-Object Language)是Qt提供的一种声明 ...

  3. uniapp微信小程序转支付宝小程序踩坑(持续更新)

    首先第一个,真有被折磨到! // 微信正常使用,支付宝不行 <image src="https://static.dabapiao.com/images/coupon-index.pn ...

  4. hashtable分析

    1.什么是Hash表? ​ Hash表又被称为散列表,是根据关键码值(key-value)也就是键值对来直接访问的一种数据结构.也就是说,它通过把关键码值映射到表中的一个位置来访问记录,用以加快查找的 ...

  5. AI-3线性回归

    3.1笔记 线性回归假设y与多个x之间的关系是线性的,且噪声符合正态分布. 线性模型则是对输入特征做仿射变换Y^ = W * X+b,其中Y^为预测值,我们希望预测值与真实值Y的误差最小.那如何衡量这 ...

  6. 通用权限系统-Dozer对象转换

    Dozer对象转换 介绍 Dozer 是一个 Java Bean 到 Java Bean 的映射器,它可以递归地将数据从一个对象复制到另一个.通常情况下,这些Java Beans将是不同的复杂类型. ...

  7. Vue-treeselect 实现下拉树懒加载,末节点不要箭头

    项目需要,可选择的下拉树,由于数据过多,显示要有层级感,所以使用了懒加载模式 vue-treeselect官网:https://www.vue-treeselect.cn/ 1.前端代码 1.下载依赖 ...

  8. python: linux使用多版本python

    安装python3.6 $ sudo add-apt-repository ppa:deadsnakes/ppa $ sudo apt update $ sudo apt install python ...

  9. opencv中的函数

    读入图像:cv2.imread(),第一个参数:未文件路径,第二个参数:告诉函数要以何种方式读取图片. cv2.IMREAD_COLOR:读入一幅彩色图像.图像的透明度会被忽略. cv2.IMREAD ...

  10. Cilium系列-9-主机路由切换为基于 BPF 的模式

    系列文章 Cilium 系列文章 前言 将 Kubernetes 的 CNI 从其他组件切换为 Cilium, 已经可以有效地提升网络的性能. 但是通过对 Cilium 不同模式的切换/功能的启用, ...