计算一个数字的大功率

时间:2012-09-02 02:55:28

标签: c++ c bignum

#include<iostream>
#include<cstdio>
#define M 1000000007
using namespace std;

long long int power(int a,int b)
{
    if(b==0)
        return 1;
    else if(b==1)
        return a;
    else if(b%2==0)
        return power((a*a)%M,b/2);
    else
        return (power((a*a)%M,b/2)*a)%M;
}

在这个函数中,当我传递a = 2,b> 31时,它总是返回0.对于b = 31我得到147483634。你能告诉问题在哪里吗?

或者你能告诉另一种计算数字大功率的方法。

3 个答案:

答案 0 :(得分:1)

(a*a)%M中,a * a可能在计算余数之前溢出。从2开始,溢出产生0并不让我感到惊讶。您需要使用能够表示(M-1)*(M-1)的类型,即1000000012000000036,而int通常限于2147483647. long long(自99以来C中的标准和C ++ 11,其他地方的共同扩展保证可以工作。

答案 1 :(得分:0)

<cmath>pow(x,y),其中x是基数,y是指数。 X ^年。

Reference here

答案 2 :(得分:0)

aint时,a*a使用int大小的算术。请尝试使用a*(long long)a,以使用不会溢出的更宽的算法。