计算一个数字的大幂

Calculating large power of a number

本文关键字:数字 一个 计算      更新时间:2023-10-16
#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.你能说出问题出在哪里吗?

或者你能说出另一种计算数字大幂的方法吗?

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

<cmath>下,有pow(x,y)其中 x 是基数,y 是指数。 x^y.

参考这里

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

相关文章: