2012-09-02 66 views
0
#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.for b = 31我得到了147483634,你告訴問題出在哪裏?計算一個數的大功率

或者你能否告訴另一種計算大數的方法。

+0

42將是更好的選擇... – Macmade

回答

1

(a*a)%M,一*計算剩餘之前可能溢出。從2開始,產生0的溢出並不讓我感到驚訝。您需要使用能夠表示(M-1)*(M-1)的類型,即1000000012000000036,而int通常限制爲2147483647. long long(自99以來的標準C以及11以後的C++,其他地方的常見擴展)上班。

+0

可以告訴你爲什麼從2開始,溢出產生0? – LAP

+0

@anubhav,溢出情況下最常見的行爲是丟棄高位。對於2的冪,結果爲0.另一個常見的溢出值是INT_MIN(對於2^31)。 – AProgrammer

0

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

Reference here

+1

這是計算一個模數整數指數。實數上的浮點數pow()不起作用。正如丹尼爾指出的那樣,它對我來說看起來是正確的。 –

0

aint時,a*a使用int大小的算術。請嘗試使用a*(long long)a,以使用不會溢出的更寬泛的算術。