亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Mod為負數正在融化我的大腦

Mod為負數正在融化我的大腦

蠱毒傳說 2019-10-05 15:16:13
我正在嘗試修改一個整數以獲取數組位置,以便它將循環。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值。


查看完整回答
反對 回復 2019-10-05
?
慕哥9229398

TA貢獻1877條經驗 獲得超6個贊

請注意,C#和C ++的%運算符實際上不是模數,而是余數。在您的情況下,所需的取模公式為:


float nfmod(float a,float b)

{

    return a - b * floor(a / b);

}

您必須使用C#(或C ++)重新編碼,但這是獲得模數而不是余數的方式。


查看完整回答
反對 回復 2019-10-05
?
心有法竹

TA貢獻1866條經驗 獲得超5個贊

增加一些理解。


根據歐幾里得的定義,模結果必須始終為正。


例如:


 int n = 5;

 int x = -3;


 int mod(int n, int x)

 {

     return ((n%x)+x)%x;

 }

輸出:


 -1


查看完整回答
反對 回復 2019-10-05
  • 4 回答
  • 0 關注
  • 813 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號