5

我需要在我的 c++ 程序中使用 pow ,如果我pow()这样调用函数:

long long test = pow(7, e);

在哪里

e 是一个整数值,值为 23。

我总是得到821077879结果。如果我用 Windows 计算器计算它,我会得到27368747340080916343..这里有什么问题?):

我试图转换为不同的类型,但这里没有任何帮助......这可能是什么原因?我怎样才能pow()正确使用?

谢谢!

4

3 回答 3

8

结果不适合long long

如果您想处理非常大的数字,请使用GMP 之类的库

或者将其存储为浮点数(不会那么精确)。

应用模数:

const unsigned int b = 5; // base
const unsigned int e = 27; // exponent
const unsigned int m = 7; // modulo

unsigned int r = 1; // remainder

for (int i = 0; i < e; ++i)
  r = (r * b) % m;

// r is now (pow(5,27) % 7)
于 2011-11-17T21:59:35.377 回答
6

7 23太大而无法放入 a long long(假设它是 64 位)。该值被截断。

编辑:哦,你为什么不说你想要pow(b, e) % m而不是只是pow(b, e)?这让事情变得简单多了,因为你根本不需要 bigint。只做你所有的算术模型m。Pubby 的解决方案有效,但这里有一个更快的解决方案(O(log e) 而不是 O(e))。

unsigned int powmod(unsigned int b, unsigned int e, unsigned int m)
{
   assert(m != 0);

   if (e == 0)
   {
      return 1;
   }
   else if (e % 2 == 0)
   {
      unsigned int squareRoot = powmod(b, e / 2, m);
      return (squareRoot * squareRoot) % m;
   }
   else
   {
      return (powmod(b, e - 1, m) * b) % m;
   }
}
于 2011-11-17T21:58:17.303 回答
4

现场观看:https ://ideone.com/YsG7V

#include<iostream>
#include<cmath>
int main()
{
    long double ldbl = pow(7, 23);
         double dbl  = pow(7, 23);
    std::cout << ldbl << ", " << dbl << std::endl;
}

输出:2.73687e+19、2.73687e+19

于 2011-11-17T22:00:05.673 回答