【发布时间】:2013-07-29 10:00:57
【问题描述】:
我正在尝试解决关于 SPOJ 的一个需要模幂运算的问题。我正在使用以下 C 代码
long long modpow(long long a,long long b,long long mod)
{
long long product,pseq;
product=1
pseq=a%mod;
while(b>0)
{
if(b&1)
product=(product*pseq)%mod;
pseq=(pseq*pseq)%mod;
b>>=1
}
return product;
}
问题是当我想计算(2^249999999997)%999999999989时,由于溢出,它给出了答案0。如何避免溢出?
【问题讨论】:
-
除非你彻底改变实现,否则我认为这是无法避免的。
-
更好地使用大数字库,如 gmp libmp...
-
int64*int64 的结果需要 int128
-
请参阅math.stackexchange.com/questions/91583/…,了解计算大幂余数背后的数学原理。
-
@mahk:计算 2 到 249999999997 需要一个 249999999997 位整数,即 29 GB 整数。我不认为一个大数字图书馆会有所帮助。
标签: c c99 integer-overflow