我正在嘗試修改一個整數以獲取數組位置,以便它將循環。i % arrayLength對于正數,這樣做很好,但對于負數,一切都會出錯。 4 % 3 == 1 3 % 3 == 0 2 % 3 == 2 1 % 3 == 1 0 % 3 == 0-1 % 3 == -1-2 % 3 == -2-3 % 3 == 0-4 % 3 == -1所以我需要一個實現int GetArrayIndex(int i, int arrayLength)這樣GetArrayIndex( 4, 3) == 1GetArrayIndex( 3, 3) == 0GetArrayIndex( 2, 3) == 2GetArrayIndex( 1, 3) == 1GetArrayIndex( 0, 3) == 0GetArrayIndex(-1, 3) == 2GetArrayIndex(-2, 3) == 1GetArrayIndex(-3, 3) == 0GetArrayIndex(-4, 3) == 2我以前做過,但是由于某種原因,今天它融化了我的大腦:(
4 回答

繁星coding
TA貢獻1797條經驗 獲得超4個贊
我總是使用自己的mod函數,定義為
int mod(int x, int m) {
return (x%m + m)%m;
}
當然,如果您不愿意兩次調用模數運算,可以將其寫為
int mod(int x, int m) {
int r = x%m;
return r<0 ? r+m : r;
}
或其變體。
它起作用的原因是“ x%m”始終在[-m + 1,m-1]范圍內。因此,如果完全為負,則將其添加到m會將其置于正范圍內,而不會更改其模m值。

慕哥9229398
TA貢獻1877條經驗 獲得超6個贊
請注意,C#和C ++的%運算符實際上不是模數,而是余數。在您的情況下,所需的取模公式為:
float nfmod(float a,float b)
{
return a - b * floor(a / b);
}
您必須使用C#(或C ++)重新編碼,但這是獲得模數而不是余數的方式。

心有法竹
TA貢獻1866條經驗 獲得超5個贊
增加一些理解。
根據歐幾里得的定義,模結果必須始終為正。
例如:
int n = 5;
int x = -3;
int mod(int n, int x)
{
return ((n%x)+x)%x;
}
輸出:
-1
- 4 回答
- 0 關注
- 813 瀏覽
添加回答
舉報
0/150
提交
取消