如何獲得以下代碼的正確模數。我被困在這里。我正在使用型別轉換來獲得我的結果。我需要回傳int。什么是正確的方法。
int m = 1000000007;
long res=0L;
if(numOne > 3)
res = (parts[1] - parts[0]) * (parts[3] - parts[2]);
return (int)res%m;
parts陣列存盤整數,res很長。上述乘法結果溢位并因此res變為負數。沒有型別轉換什么是最好的方式這樣做..
res = (long)(parts[1] - parts[0]) * (long)(parts[3] - parts[2]);
上面的代碼作業正常。
uj5u.com熱心網友回復:
在乘法之前使用模數,因為您當前的實作在某些情況下可能會溢位:
int m = 1000000007;
long res = 0L;
if (numOne > 3)
res = ((parts[1] - parts[0] m) % m) * ((parts[3] - parts[2] m) % m);
return res % m;
參考:這里
uj5u.com熱心網友回復:
為避免溢位,您需要將 mod 應用于乘法的每一側并將乘法的每一側轉換為 long(或者更好的是,將部分更改為 long 陣列)
res = (long)(parts[1] - parts[0])%m * (long)(parts[3] - parts[2])%m;
uj5u.com熱心網友回復:
使用效用函式進行模塊化操作。并在任何操作之前將ints 強制轉換為longs。
long mod(long n){
return (a % m m) % m;
}
res = mod(mod((long)parts[1] - parts[0]) * mod((long)parts[3] - parts[2]));
uj5u.com熱心網友回復:
在一般情況下,整數溢位有幾種可能導致錯誤答案:
parts[1] - parts[0]
可以超過Integer.maxValue/ Integer.minValue(例如-1_000_000_000 - 2_000_000_000),這就是為什么我們應該轉換為long:
(long)parts[1] - parts[0]
然后
(parts[1] - parts[0]) * (parts[3] - parts[2])
可以超過Long.maxValue,我們必須計算每一項的余數:
((long)parts[1] - parts[0]) % m
((long)parts[3] - parts[2]) % m
最后
res = ((((long)parts[1] - parts[0]) % m) * (((long)parts[3] - parts[2]) % m)) % m;
如果任何術語可以是負數并且您想要非負數 res:
res = (((((long)parts[1] - parts[0]) % m) *
(((long)parts[3] - parts[2]) % m)) % m m) % m;
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/340388.html
下一篇:為K排序陣列問題編譯此代碼時出錯
