算法模板 - 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 ... 
随机推荐
- Rest vs Soap 比较
			一.前言 昨天为止,政府的一个公共部门的项目顺利结束,就系统间消息传输这个点,知识点总结一下.本文主要参考octoperf的文章,链接见文末参考资料. 系统中用到的是SOAP协议进行传输数据,有人会立 ... 
- python去除文件中重复的行
			去除文件中重复的行 import os with open('db.txt','r',encoding='utf-8') as read_f,\ open('.db.txt.swap','w',enc ... 
- matplotlib的学习9-bar柱状图
			import matplotlib.pyplot as plt import numpy as np ''' 向上向下分别生成12个数据,X为 0 到 11 的整数 ,Y是相应的均匀分布的随机数据. ... 
- String 和 StringBuffer,StringBuilder 的区别
			String 和 StringBuffer,StringBuilder 的区别 String 是 " 字符串常量" , 对象一旦创建就不可改变,这就导致如果字符串常量池中没有所需对 ... 
- Apache Calcite 论文学习笔记
			特别声明:本文来源于掘金,"预留"发表的[Apache Calcite 论文学习笔记](https://juejin.im/post/5d2ed6a96fb9a07eea32a6f ... 
- Abp(net core)+easyui+efcore实现仓储管理系统——出库管理之八(五十七)
			abp(net core)+easyui+efcore实现仓储管理系统目录 abp(net core)+easyui+efcore实现仓储管理系统--ABP总体介绍(一) abp(net core)+ ... 
- [译] ConstraintLayout 可视化[Design]编辑器(这到底是什么)[第四部分]
			原文地址:Testing Views in Isolation with Espresso 原文作者:Ataul Munim 译文出自:掘金翻译计划 译者:yazhi1992 校对者:lovexiao ... 
- 强大的动态SQL
			1 动态SQL# 那么,问题来了: 什么是动态SQL? 动态SQL有什么作用? 传统的使用JDBC的方法,相信大家在组合复杂的的SQL语句的时候,需要去拼接,稍不注意哪怕少了个空格,都会导致错误.My ... 
- Spring Boot 有哪些优点?
			a.减少开发,测试时间和努力. b.使用 JavaConfig 有助于避免使用 XML. c.避免大量的 Maven 导入和各种版本冲突. d.通过提供默认值快速开始开发.没有单独的 Web 服务器需 ... 
- 数据接口请求异常:parsererror
			问题一:直接拿别人的文件放在本地打开 如下图 原因:这是提示"交叉源请求仅支持协议方案:HTTP.数据.Chrome.Chrome扩展.HTTPS." 也就是你不能用本地文件打开, ... 
