高精度计算:C++ LongInt实现

一、为什么需要高精度计算

在进行数字计算的时候,常常会遇到数值过大(超过计算机所能表示的范围)的情况。例如,计算排列组合数、大数乘法、大数除法、高精度加减法、高精度幂等计算等。这时,就需要用到高精度计算。

高精度计算是通过将一个大数拆分成多个小数,然后利用计算机的机制来进行处理,进而达到表示大数的目的。一般情况下,我们可以利用数组存储一个数,每个元素存储这个数的一位,这样就可以表示任意长度的大数。

二、C++ LongInt实现

C++语言本身就支持很好的高精度计算,用STL即可。例如vector、string等类,都可以进行高精度运算。另外,我们还可以自己实现一些高精度的类,例如LongInt。

下面给出一个简单的LongInt类实现,包括加、减、乘、除、取模、赋值、大小比较等基本操作。

#include<vector>
#include<iostream>
using namespace std;
class LongInt{
public:
    vector<int>num;
    bool flag;
    LongInt(){flag=false;}
    LongInt(string s){init(s);}
    LongInt(const LongInt&a){num=a.num;flag=a.flag;}
    void init(string&s){
        int len=s.length()-1;
        while(len>=0){num.push_back(s[len]-'0');len--;}
        flag=s[0]=='-';
        if(flag)num.pop_back();
    }
    LongInt&operator+(LongInt&rhs){
        int carry=0;
        int len=max(num.size(),rhs.num.size());
        for(int i=0;i=num.size())num.push_back(0);
            num[i]=carry%10;
            carry/=10;
        }
        if(carry)num.push_back(carry);
        return*this;
    }
    LongInt&operator-(LongInt&rhs){
        int borrow=0;
        for(int i=0;i1&&num.back()==0)num.pop_back();
        return*this;
    }
    LongInt&operator*(LongInt&rhs){
        vector<int>result(num.size()+rhs.num.size(),0);
        for(int i=0;i1&&num.back()==0)num.pop_back();
        return*this;
    }
    LongInt&operator/(LongInt&rhs){
        int len=num.size()-rhs.num.size();
        LongInt quotient;quotient.flag=flag^rhs.flag;
        if(len<0){
            quo.num.push_back(0);
            return quotient;
        }
        LongInt dividend(*this<=0;i--){
            int l=0,r=10,ans=0;
            while(l<=r){
                int mid=(l+r)>>1;
                if(dividend>=(divisor*mid)){l=mid+1;ans=mid;}
                else r=mid-1;
            }
            quotient.num.insert(q.n.begin(),ans);
            dividend-=(divisor*ans);
            divisor>>1;
        }
        while(quotient.num.size()>1&"ient.num.back()==0)quotient.num.pop_back();
        return quotient;
    }
    LongInt&operator%(LongInt&rhs){
        *this-*((*this/rhs)*rhs);
        return*this;
    }
    LongInt&operator<<(int n){
        while(n--)num.insert(num.begin(),0);
        return*this;
    }
    bool operator>(LongInt&r){
        if(num.size()!=r.num.size())return num.size()>r.num.size();
        for(int i=num.size()-1;i>=0;i--)if(num[i]!=r.num[i])return num[i]>r.num[i];
        return false;
    }
    bool operator<(LongInt&rhs){return rhs>*this;}
    bool operator=(LongInt&rhs){
        num=rhs.n;
        return flag=rhs.flag;
    }
    void print(){
        if(flag)putchar('-');
        for(int i=num.size()-1;i>=0;i--)putchar(num[i]+'0');
    }
};

三、使用LongInt类实现高精度计算

下面,我们来利用上面实现的LongInt类进行高精度计算。可以实现加法、减法、乘法、除法、取模等计算。

#include<iostream>
#include<string>
#include"LongInt.h"
using namespace std;
int main(){
    string s1="123456789012345678901234567890";
    string s2="987654321098765432107654321098";
    
    LongInt a(s1),b(s2);
    cout<<"a=";a.print();cout<<endl;
    cout<<"b=";b.print();cout<<endl;
    cout<<"add=";(a+b).print();cout<<endl;
    cout<<"sub=";(a-b).print();cout<<endl;
    cout<<"mul=";(a*b).print();cout<<endl;
    cout<<"div=";(a/b).print();cout<<endl;
    cout<<"mod=";(a%b).print();cout<<endl;
    
    return 0;
}

四、总结

本文介绍了高精度计算以及其重要性,同时,通过C++语言自带类实现了高精度计算功能,并且给出了相应的数学运算实现,例如加、减、乘、除、取模等操作。尽管C++语言自带的类可以实现高精度计算,但自己实现高精度类的好处也是显而易见的,例如可以提高代码的效率、更好的理解高精度计算。

本文链接:https://my.lmcjl.com/post/16363.html

展开阅读全文

4 评论

留下您的评论.