前言
有些题的数据范围很大,以至于开了long long还是会爆…
为此我写了大整数,大致思想是开long long数组存储每九位数字(多了在处理乘法的时候会爆),然后用一个布尔值来判断正负。
目前支持赋值,加法,减法,乘法,除法,比较。
感觉除法太难,暂时没想出来怎么写,可能以后用到了会补上吧(orz)。
除法已于9月6日0点补上。(睡觉前灵光一闪,想到二分法可以解决除法,爬起来写了)
使用方法
声明:
bignum a,b,c;
初始化:
a.clear();
b.clear();
赋值:
a = 123; //赋值int类型
a = "123"; //赋值字符串类型(char *)
a = b; //赋值bignum类型
运算(支持 + - *):
c = a + b; //bignum + bignum
c = a + 1; //bignum + int
c += a; //bignum += bignum
c += 1; //bignum += int
c = -a; //bignum的负数
比较:
if (a < c)
{
//...
}
if (a >= c)
{
//...
}
打印
a.show();
实现思路
闲来无事,仔细讲一讲写大整数时的思路吧。
大整数存储
就是用一个数组存一个较大的数字,为了效率,我开的是longlong数组,每一位可以存1e9的数字,存1e9可以方便借位,而且1e9乘1e9也不会爆long long。
每一位数字乘以1e9^下标的和即为大整数本身,用a[i]表示大数a的每一位数字,则:
a = ∑ i = 1 n a [ i ] × 1 e ( 9 i ) a = \sum\limits_{i=1}^n a[i] × 1e(9i) a=i=1∑na[i]×1e(9i)
乘法实现
若用a[i]表示大数a的每一位数字,b[i]表示大数b的每一位数字,则易得:
a ∗ b = ∑ i ∑ j a [ i ] × b [ i ] × 1 e ( 9 ( i + j ) ) a*b=\sum\limits_{i}\sum\limits_{j} a[i] × b[i]×1e(9(i+j)) a∗b=i∑j∑a[i]×b[i]×1e(9(i+j))
也就是先把 a = 123 , 456 , 789 a = 123,456,789 a=123,456,789看成 a = 123 × 1 e 6 + 456 × 1 e 3 + 789 a = 123 × 1e6 + 456 × 1e3 + 789 a=