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

  1. 算法模板学习专栏之总览(会慢慢陆续更新ing)

    博主欢迎转载,但请给出本文链接,我尊重你,你尊重我,谢谢~http://www.cnblogs.com/chenxiwenruo/p/7495310.html特别不喜欢那些随便转载别人的原创文章又不给 ...

  2. 让ecshop模板支持php运算

    让ecshop模板支持php运算在 cls_template.php 底部加入函数: /** * 处理if标签 * * @access public * @param string $tag_args ...

  3. 匈牙利 算法&模板

    匈牙利 算法 一. 算法简介 匈牙利算法是由匈牙利数学家Edmonds于1965年提出.该算法的核心就是寻找增广路径,它是一种用增广路径求二分图最大匹配的算法. 二分图的定义: 设G=(V,E)是一个 ...

  4. Tarjan 算法&模板

    Tarjan 算法 一.算法简介 Tarjan 算法一种由Robert Tarjan提出的求解有向图强连通分量的算法,它能做到线性时间的复杂度. 我们定义: 如果两个顶点可以相互通达,则称两个顶点强连 ...

  5. hdu 2255 奔小康赚大钱--KM算法模板

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2255 题意:有N个人跟N个房子,每个人跟房子都有一定的距离,现在要让这N个人全部回到N个房子里面去,要 ...

  6. POJ 1273 Drainage Ditches(网络流dinic算法模板)

    POJ 1273给出M条边,N个点,求源点1到汇点N的最大流量. 本文主要就是附上dinic的模板,供以后参考. #include <iostream> #include <stdi ...

  7. poj 1274 The Perfect Stall【匈牙利算法模板题】

    The Perfect Stall Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 20874   Accepted: 942 ...

  8. 高精度运算专题3-乘法运算(The multiplication operation)

    这个专题呢,我就来讲讲高精度的乘法,下面是三个计算乘法的函数,第一个函数是char类型的,要对字符串进行数字转换,而第二个是两个int类型的数组,不用转换成数字,第三个则更为优化,用a数组-b数组放回 ...

  9. [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 ...

随机推荐

  1. Oracle数据导入Mysql中

    一.Navicat Premium中的数据迁移工具 为了生产库释放部分资源,需要将API模块迁移到mysql中,及需要导数据. 尝试了oracle to mysql工具,迁移时报错不说,这么大的数据量 ...

  2. react第二十单元(react+react-router-dom+redux综合案例2)

    第二十单元(react+react-router-dom+redux综合案例2) #课程目标 #知识点 #授课思路 #案例和作业

  3. 机器学习速查表(cheatsheet)资源汇总分享

    本文收集整理了机器学习相关速查表(Machine Learning Cheatsheet),包含机器学习.Python.Numpy.Pandas.Matplotlib.线性代数.微积分.统计学.概率论 ...

  4. 网络编程-python实现-socket(1.1.1)

    @ 目录 1.不同电脑进程之间如何通信 2.什么是socket 3.创建socket 1.不同电脑进程之间如何通信 利用ip地址 协议 端口 标识网络的进程,网络中的进程通信就可以利用这个标志与其他进 ...

  5. Python(循环语句与数据类型)

    循环语句 对于python来说 基本上循环用的两个 wile 跟静态语言相似 下来是for循环 这个就跟静态语言大大不同了 wile 条件:–>while 循环也就是 当条件为真的时候会一直循环 ...

  6. k8s之深入解剖Pod(三)

    目录: Pod的调度 Pod的扩容和缩容 Pod的滚动升级 一.Pod的调度 Pod只是容器的载体,通常需要通过RC.Deployment.DaemonSet.Job等对象来完成Pod的调度和自动控制 ...

  7. Android基础工具移植说明

    早前开展的计划因各种杂事而泡汤,而当遇到了具体任务后,在压力下花了两个多周的业余时间把这件事完成了. 这就是我的引以为傲的Mercury-Project,它的核心目标是移植一些Android底层轮子到 ...

  8. 其实吧,LRU也就那么回事。

    这是why哥的第 81 篇原创文章 你面试的时候遇见过LRU吗? LRU 算法,全称是Least Recently Used. 翻译过来就是最近最少使用算法. 这个算法的思想就是:如果一个数据在最近一 ...

  9. 使用@Cacheable注解时,Redis连不上,直接调用方法内部的解决方案

    最近redis 域名一致解析错误,导致业务多了很多异常.那么如何在这种情况下直接访问数据库,而不是报错呢 1. 解决方案 其实很简单,在配置 redis 时,只需要多一项配置,继承 CachingCo ...

  10. [leetcode]109. Convert Sorted List to Binary Search Tree链表构建二叉搜索树

    二叉树的各种遍历方式都是可以建立二叉树的,例如中序遍历,就是在第一步建立左子树,中间第二步建立新的节点,第三步构建右子树 此题利用二叉搜索树的中序遍历是递增序列的特点,而链表正好就是递增序列,从左子树 ...