2016-07-04 24 views
0
 for(i=0; i<n+1; i++) 
     { 
      y=y+(a[i]*(int)Math.pow(j,i)); 
     } 
     int r=y/786433; 
     s[k]=y-(r*786433); 
     k++; 

现在在此代码中j的值可以是786432。所以,当我尝试获得一个数字的模数,如(1+2*(786432)^2+3*(786432)^3)%786433然后我得到-521562这是不正确的我以前也使用模运算符,但即使采用这种方法,我也得到了相同的答案,我得到的答案相同。在这种方法中,数字的模数存储在数组s[k]中。谁能帮忙?找到java中巨大数字的模数

+0

786432立方甚至没有那么大。顺便说一句,你可以使用模幂运算来避免大数目。 – harold

+0

作为sidenode,这是余数运算符,而不是模运算符。如果一个数值是负数,余数可以返回负数,但数学模算子不能这样做。如果你想使用数学模运算'Math#floorMod' – SomeJavaGuy

+0

@harold,但它存储在'int'中太大了。 – Jesper

回答

2

如果您使用Math.pow您正在使用双重类型。然后你将它转换回int。如果值太大,舍入可能会发生并截断。

为了解决这个问题,你需要使用BigInteger

不可变的任意精度的整数

特别的方法mod

返回一个BigInteger,其值是(这个mod m)。此方法与其余部分不同之处在于它总是返回一个非负BigInteger。

+0

感谢@davideLorenzoMarino类型铸造是不必要的。它给出了正面答案2 – vidhit