算法模板 - C++ 高精度运算
C++算法板子
高精度
高精度推荐用python来写,python有大整数,这里写的是关于C++的高精度运算模板
1、高精 * 低精
#include <iostream>
#include <vector>
using namespace std;
vector<int> mul ( vector<int> A, int b )
{
vector<int> C; // 结果按位存到 C 中
int t = 0; // 存放进位的数
for ( int i = 0; i < A.size() || t; i++ ) // 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(); // 消除最高位上多余的0
return C;
}
int main ( void )
{
// 计算 C = A * b;
string a; // eg. input >> "123456" -> a;
int b;
vector<int> A, C; // A 将存储 "654321";
cin >> a >> b;
for ( int i = a.size() - 1; i >= 0; i-- ) A.push_back( a[i] - '0' );
C = mul ( A, b );
for ( int i = C.size() - 1; i >= 0; i-- ) cout << C[i];
return 0;
}
while ( C.size() > 1 && C.back() == 0 ) C.pop_back(); // 消除最高位上多余的0 这个是为了防止以下情况出现

2、高精 + 高精
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
vector<int> add ( vector<int> A, vector<int> B )
{
vector<int> C;
int t = 0;
for ( int i = 0; i < A.size() || i < B.size(); i++ )
{
if ( i < A.size() ) t += A[i];
if ( i < B.size() ) t += B[i];
C.push_back ( t % 10 );
t /= 10;
}
if ( t ) C.push_back ( 1 );
return C;
}
int main ( void )
{
string a, b;
vector<int> A, B, C;
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' );
C = add ( A, B );
for ( int i = C.size() - 1; i >= 0; i-- )
printf ( "%d", C[i] );
return 0;
}
3、高精 - 高精
#include <iostream>
#include <vector>
using namespace std;
bool cmp ( string a, string b )
{
if ( a.size() > b.size() ) return true;
else if ( a.size() < b.size() ) return false;
else if ( a >= b ) return true; // 长度相同时 按字典序大小比较
else return false;
}
vector<int> sub ( vector<int> A, vector<int> B )
{
vector<int> C;
int t = 0;
for ( int i = 0; i < A.size(); i++ )
{
t = 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 ( void )
{
string a, b; // 输入 “123456”
vector<int> A, B, C; // 转换为“654321”存放到
cin >> a >> b;
for ( int i = a.size() - 1; i >= 0; i-- ) A.push_back ( a[i] - '0' ); // 倒序存储 “654321”
for ( int i = b.size() - 1; i >= 0; i-- ) B.push_back ( b[i] - '0' );
if ( cmp ( a, b ) )
{
C = sub ( A, B );
} else {
cout << "-"; // A < B 时,先输出负号
C = sub ( B, A );
}
for ( int i = C.size() - 1; i >= 0; i-- ) cout << C[i];
return 0;
}
4、高精 / 低精 ,余 低精
计算非负整数相除,分母不为零
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
vector<int> div ( vector<int> A, int b, int &t ) // 注意 t 为 “引用”
{
vector<int> C;
t = 0;
for ( int i = A.size() - 1; i >= 0; i-- ) // 注意这里是正序修改(在倒序的基础上倒序)
{
t = t * 10 + A[i];
C.push_back ( t / b );
t %= b;
}
reverse ( C.begin(), C.end() ); // 倒序修改后导致答案是正序的 将其反转为倒序
while ( C.size() > 1 && C.back() == 0 ) C.pop_back(); // 后面的步骤都一样了
return C;
}
int main ( void )
{
string a; // 需要输入正序 a 然后倒序存入 A
int b;
vector<int> A, C;
cin >> a >> b;
for ( int i = a.size() - 1; i >= 0; i-- ) A.push_back ( a[i] - '0' );
int t = 0; // t 存放余数;
C = div ( A, b, t ); // 高精 A * 低精 b 余低精 t
for ( int i = C.size() - 1; i >= 0; i-- ) cout << C[i]; // 倒序打印输出答案 ( 因是倒序存储 )
cout << endl << t;
}
算法模板 - C++ 高精度运算的更多相关文章
- 算法模板学习专栏之总览(会慢慢陆续更新ing)
博主欢迎转载,但请给出本文链接,我尊重你,你尊重我,谢谢~http://www.cnblogs.com/chenxiwenruo/p/7495310.html特别不喜欢那些随便转载别人的原创文章又不给 ...
- 让ecshop模板支持php运算
让ecshop模板支持php运算在 cls_template.php 底部加入函数: /** * 处理if标签 * * @access public * @param string $tag_args ...
- 匈牙利 算法&模板
匈牙利 算法 一. 算法简介 匈牙利算法是由匈牙利数学家Edmonds于1965年提出.该算法的核心就是寻找增广路径,它是一种用增广路径求二分图最大匹配的算法. 二分图的定义: 设G=(V,E)是一个 ...
- Tarjan 算法&模板
Tarjan 算法 一.算法简介 Tarjan 算法一种由Robert Tarjan提出的求解有向图强连通分量的算法,它能做到线性时间的复杂度. 我们定义: 如果两个顶点可以相互通达,则称两个顶点强连 ...
- hdu 2255 奔小康赚大钱--KM算法模板
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2255 题意:有N个人跟N个房子,每个人跟房子都有一定的距离,现在要让这N个人全部回到N个房子里面去,要 ...
- POJ 1273 Drainage Ditches(网络流dinic算法模板)
POJ 1273给出M条边,N个点,求源点1到汇点N的最大流量. 本文主要就是附上dinic的模板,供以后参考. #include <iostream> #include <stdi ...
- poj 1274 The Perfect Stall【匈牙利算法模板题】
The Perfect Stall Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 20874 Accepted: 942 ...
- 高精度运算专题3-乘法运算(The multiplication operation)
这个专题呢,我就来讲讲高精度的乘法,下面是三个计算乘法的函数,第一个函数是char类型的,要对字符串进行数字转换,而第二个是两个int类型的数组,不用转换成数字,第三个则更为优化,用a数组-b数组放回 ...
- [code]高精度运算
数组存储整数,模拟手算进行四则运算 阶乘精确值 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 #includ ...
随机推荐
- 栈的应用:表达式括号匹配检测(C)
问题说明: 假设数学表达式中允许包含两种括号:圆括号"()"和方括号"[]",嵌套顺序任意. 正确的嵌套模式:( [ ] ( ) ).[ ( [ ] [ ] ) ...
- 一文搞懂 CountDownLatch 用法和源码!
CountDownLatch 是多线程控制的一种工具,它被称为 门阀. 计数器或者 闭锁.这个工具经常用来用来协调多个线程之间的同步,或者说起到线程之间的通信(而不是用作互斥的作用).下面我们就来一起 ...
- Elasticsearch 学习二(请求流程).
一.写入数据 1.ES 的任意节点都可以作为协调(Coordinating)节点接受请求(包括新建.索引或者删除请求),每个节点都知道集群中任一文档位置: 2.协调节点会通过 routing 字段计算 ...
- Java与C#的代码区别
Java和C#都是编程的语言,它们是两个不同方向的两种语言 相同点: 他们都是面向对象的语言,也就是说,它们都能实现面向对象的思想(封装,继承,多态) 区别: 1.c#中的命名空间是namespace ...
- C# 如何查询字符串前面有几个0
有几个0 string t = "0001203"; int tLen = t.Length - t.TrimStart('0').Length; charAt方法 using S ...
- Mybatis-Plus的Service方法使用 之 泛型方法default <V> List<V> listObjs(Function<? super Object, V> mapper)
首先 我们先看到的这个方法入参是:Function<? super Object , V> mapper ,这是jdk1.8为了统一简化书写格式引进的函数式接口 . 简单 解释一下我对Fu ...
- Arduino IDE开发ESP8266-01S连接MQTT服务器 控制继电器点亮LED
准备条件: 1.Arduino IDE 2.ESP-01S模块 2.MQTT服务器 3.手机热点或路由器热点 Wi-Fi芯片 默认订阅的主题是 "开关控制" 当你发送主题 &q ...
- SpringBoot 集成Elasticsearch进行简单增删改查
一.引入的pom文件 <?xml version="1.0" encoding="UTF-8"?> <project xmlns=" ...
- 杭电OJ2010---水仙花数(c++)(方法:输出几个数之间用空格隔开,最后一个数没有空格)
水仙花数 Problem Description 春天是鲜花的季节,水仙花就是其中最迷人的代表,数学上有个水仙花数,他是这样定义的: "水仙花数"是指一个三位数,它的各位数字的立方 ...
- 杭电OJ2007----平方和与立方和(易错题)
Problem Description 给定一段连续的整数,求出他们中所有偶数的平方和以及所有奇数的立方和. Input 输入数据包含多组测试实例,每组测试实例包含一行,由两个整数m和n组成. Out ...