这里我们简单介绍一下高精度的计算。
我们都知道在Cpp/C/Pas
等语言中,整数最大能储存\(2^{64} -1\),超过这个范围就表示不了了(不包括个别支持int128
的编译器)。这个时候,我们如果希望把这些整数存储下来,就需要用到高精度的算法和思想。高精度就是像小学学过的竖式运算一样的(除法除外)。然后就直接模拟即可。除法一位一位地试商即可。
接下来我们发现就是一位一位地加减很慢,我们考虑如何把它加快速度(减小常数)。如果你有学习过关于bitset
的相关知识,那你肯定对压位的方法不陌生。我们把十进制位中的每4~8位并在一起(笔者一般压4位,因为乘法时不会超过int
的范围),然后照样加减,最后并不影响答案,但是要注意输出。对于除法,我们此时发现枚举\(10^4\)到\(10^8\)太慢了,注意到单调性,于是我们考虑二分试商,这样就也可以在\(log_2 BASE\)的时间之内求出来了。
注意初始化、赋值和输出。
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
typedef int ll;
struct bign//big number
{
//init
static const int BASE=(int)1e4,POW=4;
static const int MAXLEN=20010;
ll num[MAXLEN];//num[0]=length of the big number
bign(int tp=0)
{
memset(num,tp,sizeof(num));
}
void clear()
{
memset(num,0,sizeof(num));
}
bool operator=(const char ch[])
{
int len=strlen(ch);