2013-03-25 148 views
0

我的代碼的冪函數存在一些錯誤,它會返回小值的正確答案,但會給出較大值的錯誤答案。爲什麼我得到一個負值?

#include<stdio.h> 
long long MOD= 1000000007; 
long long power(long long i,long long j) 
{ 
     if(j==0) 
       return 1; 
     long long d; 
     d=power(i,j/(long long)2); 
     if(j%2==0) 
       return (d*d)%MOD; 
     else 
       return (d*d*i)%MOD; 
} 

int main() 
{ 
     long long inv=1; 
     inv=power(25,MOD-2)%MOD; 
     printf("%lld\n",inv); 
} 
+1

有意詳細說明問題嗎? – 2013-03-25 13:00:49

+0

你有什麼問題?編譯錯誤?運行時錯誤?錯誤的結果?如果最後一個,你期望結果是什麼,爲什麼會得到一些價值? – 2013-03-25 13:03:58

+0

沒有錯誤....只是錯誤的答案 – TLE 2013-03-25 13:04:54

回答

0

簽名long long的範圍是-2^63到(2^63 - 1),最後一位用於存儲符號。在你的情況下,當大數乘法的計算結果會比你的結果溢出並且第64位數(存儲符號)將得到值1(這意味着-ve值)。

這就是你得到負值作爲輸出的原因。

Read this

1

您的算術溢出了C實現中的long long中表示的值。

此外,您正在處理一個挑戰問題或已在Stack Overflow上多次討論的作業,正如您通過搜索「1000000007」所看到的。

+0

我沒有問題算法。我有問題與c。在python我得到正確的結果相同的問題 – TLE 2013-03-25 13:36:53

0

你必須要小心(d*d*i)%MOD;,因爲沒有模多個操作不正確,採取精確性,而且在賬戶溢出的風險。要嚴格正確的,你需要寫

return ((d*d)%MOD * i)%MOD; 

即使在這種情況下,我認爲i == i%MOD

編輯:我舉個例子:

log2((MOD-1)x(MOD-1)x25) = log2(1000000006x1000000006x25) = 64.438 

這意味着你將與你的計算過程中溢出這個輸入。

+0

看到編輯,我舉了一個例子,我的意思。 – UmNyobe 2013-03-25 13:36:34