1. 程式人生 > 其它 >迴圈陣列%操作下的一些解釋(對於4.4UVA133的一些解釋)

迴圈陣列%操作下的一些解釋(對於4.4UVA133的一些解釋)

1.迴圈陣列一般不推薦通過建立相同的陣列不斷疊加來實現,雖然理論上是可行的,但是會浪費極大的空間,特別是對於大資料的情況下,程式一般會馬上掛掉
2.迴圈陣列的結構表示中的一種常用形式就是通過取餘操作來實現這種偽迴圈
3.取餘操作對負數取餘其結果仍然是負數,對正數取餘其結果是正數,對0取餘其結果仍然是0
4.對於作者的p = (p + d + n - 1) % n + 1;的程式碼的解釋
首先我們要明白這邊作者為了解決取餘操作中永遠不可能出現的n,其是通過改變計算方法來實現,當然我們也可以通過改變陣列的對應關係來實現,例如原先的對應關係是i = i,我們可以調整為i = i+1,這樣雖然符合了取餘的範圍,但是對於資料的模擬情況顯然不是非常好的,因此接下來將會介紹作者的做法

首先要讓10 % 10 == 10,那麼就需要以下的操作,(10 - 1)% 10 + 1;
也就是讓所有的數字往後退一位,注意這時候這些數字仍然是在取餘的範圍內的,即例如n % m 其計算的範圍是0到m-1,而這時候n的取值範圍是1到m,那麼我們就先把n的範圍調整到m的範圍就可以了,注意這邊的n可以取任意值,只不過去除其中一段比較特殊的來方便說明,拓展如果n的範圍是k,k+m-1那麼要實現上述所說的m % m == m;只需要下面的操作(m - k)% m + k(n == m)
也就是說上述的操作實現了將原本取餘後會等於0的m轉變為仍為m,而並不會改變其他數的取餘結果

因此(p - 1)% n + 1是一個整體
而+d作者自己本身已經給出就是步長引數來控制是順時針還是逆時針,那麼最後為什麼還要+n呢,注意前面所說的負數取餘仍然是負數,因此我們必須要保證(p + d + n - 1)的結果是正數,否則就會使得結果出現錯誤,可以憑藉自己本身的感受知道,p最小為1,而上述的式子最小也就是-1,加上n是足夠的了
同時也就是說 如果 n % m = k;那麼(n + m)% m = k;

這邊給出筆者自己的另一些小技巧,取餘後是負數如何調整可以這樣
假設 n % m = k;k不是正數,如何調整呢
(k + m) % m(這邊之所以還需要對m取餘是因為如果k=0的話加上m會超過m的取餘範圍的)