c ++中大数字的模运算

时间:2015-03-12 18:31:40

标签: c++ modular-arithmetic

在我短暂的体育节目生涯中,我遇到了很多时间计算数字模型,如

26164615615665561165154564545......%(10000007)

我做了一些研究,但只能找到

形式的数字模型的计算
(a^b)%c

任何人都可以解释如何像第一个例子那样计算数字模型。

2 个答案:

答案 0 :(得分:2)

C ++没有任何长整数算术工具作为标准库的一部分。 如果要使用长整数进行计算,则需要依赖外部库。

两个好的选择似乎是

以下是使用NTL如何完成模幂运算的示例(取自NTL examples):

ZZ PowerMod(const ZZ& a, const ZZ& e, const ZZ& n)
{
   if (e == 0) return ZZ(1);

   long k = NumBits(e);
   ZZ res;
   res = 1;

   for (long i = k-1; i >= 0; i--) {
      res = (res*res) % n;
      if (bit(e, i) == 1) res = (res*a) % n;
   }
   if (e < 0)
      return InvMod(res, n);
   else
      return res;
}

答案 1 :(得分:0)

我找到了解决方案(可能)

所以,这里有解释。如果我们想要计算非常大的数字的mod,不能存储为任何数据类型,而不是我们必须将数字作为字符串。我们会做类似的事情此

 int remainder(string &s,first)
 {
   int rem=0;
   for(int i=0;i<s.length();++i)
   rem=rem*10+(s[i]-'0');//Explaining this below
   return rem;
 }

为什么会起作用?拿一张纸和一支笔,然后开始用数字首先划分字符串(取100)。

  For example, for 1234 % 100.
  1 mod 100 = 1
  12 mod 100 =(1 * 10 + 2) mod 100 =12
  123 mod 100 =(12 * 10 + 3) mod 100 =23
  1234 mod 100 =(23 * 10 + 4) mod 100 =34

PS:这是我的第一个回答。我写了回答我自己的问题,但我认为这对未来的读者会有好处。

相关问题