循环数组%操作下的一些解释(对于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的取余范围的)

posted @   banyanrong  阅读(60)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示