📜  如何在C++中存储大量超过100位的数字(1)

📅  最后修改于: 2023-12-03 15:24:27.341000             🧑  作者: Mango

如何在C++中存储大量超过100位的数字

在C++中,long long是一种数据类型,它可以存储最大为9223372036854775807的整数(64位),然而,如果需要存储超过100位的数字,long long是无法胜任的。那么如何在C++中存储大量超过100位的数字呢?下面介绍几种常用的方法。

方法一:字符串存储

字符串是一种常用的方式,将大数以字符串的形式存储起来。在字符串中,每一位代表一个数字,通过字符串的特性可以方便地进行大数的加减乘除等操作。下面是一个简单的例子:

#include<iostream>
#include<string>
using namespace std;

int main()
{
    string a = "123456789123456789123456789123456789";
    string b = "987654321987654321987654321987654321";
    cout << a << "+" << b << "=" << endl;
    string ans = add(a, b);
    cout << ans << endl;
    return 0;
}

string add(string a, string b) // 大数加法
{
    string ans="";
    int carry=0;
    for(int i=a.size()-1,j=b.size()-1;i>=0||j>=0;i--,j--)
    {
        int x=i>=0?a[i]-'0':0;
        int y=j>=0?b[j]-'0':0;
        carry+=x+y;
        ans+=(carry%10+'0');
        carry/=10;
    }
    if(carry>0) ans+=(carry+'0');
    reverse(ans.begin(),ans.end());
    return ans;
}
方法二:高精度数组存储

方法一中使用字符串存储大数,虽然方便,但是字符串也有一些不足之处,比如增加了一些转化的时间和空间,而且还需要手动实现大数的加减乘除等操作,可能会增加程序的复杂度。因此,有些人会选择使用高精度数组存储大数,这样可以极大地提高计算速度。在使用高精度数组时,需要自己实现加减乘除等操作,下面是一个示例。

#include<iostream>
#include<cstring>
using namespace std;

const int MAXN=5e5+5;

struct bigInt{
    int len,dig[MAXN];
    bigInt() { memset(dig,0,sizeof(dig));len=1;}
};

bigInt toBigInt(string s)
{
    bigInt w;
    w.len=s.length();
    for(int i=0;i<w.len;i++)
    {
        w.dig[i]=s[w.len-i-1]-'0';
    }
    return w;
}

bigInt add(bigInt a,bigInt b)
{
    bigInt w;
    int len=max(a.len,b.len);
    for(int i=0;i<len;i++)
    {
        w.dig[i]+=a.dig[i]+b.dig[i];
        w.dig[i+1]+=w.dig[i]/10;
        w.dig[i]%=10;
    }
    w.len=len;
    if(w.dig[w.len]>0) w.len++;
    return w;
}

ostream& operator<<(ostream& os,const bigInt& w)
{
    for(int i=w.len-1;i>=0;i--)
    {
        os<<w.dig[i];
    }
    return os;
}

int main()
{
    string s1,s2;
    cin>>s1>>s2;
    bigInt a=toBigInt(s1);
    bigInt b=toBigInt(s2);
    cout<<add(a,b)<<endl;
    return 0;
}
方法三:库函数存储

使用第一种方法和第二种方法,需要手动实现大数的加减乘除等操作,因此可能会增加程序的复杂度,而且对算法的熟悉程度也有一定的要求。而使用库函数存储大数,则可以大大方便计算过程。在C++中,STL提供了可以处理大数的库函数,即 BigInteger。下面是一个简单的示例。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cstdlib>
#include<utility>
#include<cmath>
#include<ctime>
#include<set>
#include<vector>
#include<queue>
#include<stack>
#include<map>
#include<bitset>
#include<sstream>
#include<deque>
#include<iomanip>
#include<fstream>
#include<gmpxx.h>
using namespace std;

int main()
{
    mpz_class a,b;
    cin>>a>>b;
    cout<<a+b<<endl;
    return 0;
}

在使用 BigInteger时,只需要用mpz_class定义变量,就可以直接进行大数计算,非常方便。

结语

以上介绍了三种常用的存储大数的方法,分别是字符串存储、高精度数组存储、库函数存储。不同的方法各有优缺点,具体使用时需要根据实际情况选择合适的方法。