大整数/高精模板

这篇博客介绍了如何处理超出long long范围的大整数,通过开long long数组存储每九位数字,支持正负判断。实现了大整数的赋值、加法、减法和乘法,并详细讲解了乘法的实现思路。此外,博主还分享了除法的实现,使用二分法优化,使除法运算的时间复杂度降低到O(n^2logm)。最后,列举了部分使用大整数模板解决的编程题目。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

有些题的数据范围很大,以至于开了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=1na[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)) ab=ija[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=

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值