2016-03-08 30 views
1

這是的Java代碼導致897986030Java和Python代碼提供不同的輸出?

import java.util.Arrays; 
import java.util.Scanner; 

class Algorithm { 
    public static void main(String args[]) throws Exception { 
     int mod = 1000000007; 
     long factor = 900414279; 
     long p1 = 883069911; 
     long p2 = 32; 
     long val = 560076994; 
     val = (val%mod+factor*p1*p2%mod)%mod; 
     System.out.println(val); 
    } 
} 

這相當於的Python代碼輸出480330031

factor = 900414279 
p1 = 883069911 
p2 = 32; 
val = 560076994; 
mod = 1000000007; 
val = (val%mod+factor*p1*p2%mod)%mod; 
print val 

請幫助。謝謝!

回答

1

答案在於,您正在使用java中的原始類型,容易溢出。

讓我來解釋一下,如果你還沒有意識到這個概念。在Java中,C,C++和類似的基本類型爲它們分配了一定的空間,變量不能使用任何空間。這意味着數據類型可以存儲的最大數量是long。這是出於性能原因而完成的。

上面代碼中可能發生的情況是,當您將兩個long值相乘時,結果可能會大於數據類型可以存儲的最大值long。這導致溢出,導致數據收窄。所以數學表達式的結果是搞砸了。

對於Python來說,這並不是什麼大問題,因爲Python可以存儲更大範圍的數字。 Python中的溢出很少見。這就是爲什麼像使用大數字的加密應用程序很容易用Python編寫的原因。

+1

非常感謝..我明白了。在添加之前,我需要使用Big Integer進行乘法運算。 :) – Shimano

+1

不需要BigInteger:只需一次將兩件事物相乘,而不是全部三件。也就是說,使用'(factor * p1%mod)* p2%mod'來代替'factor * p1 * p2%mod'。 –

+0

是的。那就是我所做的。沒有更新我的評論。謝謝 :) – Shimano

相關問題