📅  最后修改于: 2023-12-03 15:24:27.341000             🧑  作者: Mango
在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定义变量,就可以直接进行大数计算,非常方便。
以上介绍了三种常用的存储大数的方法,分别是字符串存储、高精度数组存储、库函数存储。不同的方法各有优缺点,具体使用时需要根据实际情况选择合适的方法。