算法模板 - C++ 高精度运算

2021-03-06 14:27

阅读:573

标签:pytho   ace   stream   amp   字典序   步骤   ret   比较   结果   

C++算法板子

  • 高精度

高精度推荐 用python来写,这里的是C++的高精度运算模板


索引:

高精 * 低精

高精 + 高精

高精 - 高精

高精 / 低精

1、高精 * 低精

#include 
#include 

using namespace std;

vector mul ( vector A, int b )
{
    vector C; // 结果按位存到 C 中
    
    int t = 0; // 存放进位的数
    for ( int i = 0; i  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 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 

while ( C.size() > 1 && C.back() == 0 ) C.pop_back(); // 消除最高位上多余的0 这个是为了防止以下情况出现

技术图片

2、高精 + 高精

#include 
#include 
#include 

using namespace std;

vector add ( vector A, vector B )
{
    vector C;
    int t = 0;

    for ( int i = 0; i  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 
#include 

using namespace std;

bool cmp ( string a, string b )
{
    if ( a.size() > b.size() ) return true;
    else if ( a.size() = b ) return true; // 长度相同时 按字典序大小比较
    else return false;
}

vector sub ( vector A, vector B )
{
    vector C;
    int t = 0;
    
    for ( int i = 0; i  1 && C.back() == 0 ) C.pop_back();
    
    return C;
}

int main ( void )
{
    string a, b; // 输入 “123456”
    
    vector 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 = 0; i-- ) cout 

4、高精 / 低精 ,余 低精

计算非负整数相除,分母不为零

#include 
#include 
#include 

using namespace std;

vector div ( vector A, int b, int &t ) // 注意 t 为 “引用”
{
    vector 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 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++ 高精度运算

标签:pytho   ace   stream   amp   字典序   步骤   ret   比较   结果   

原文地址:https://www.cnblogs.com/judezhang/p/14292072.html


评论


亲,登录后才可以留言!