问题是写一个函数rotate(ar [],d,n),用d元素旋转大小为n的arr []。 解决方案(杂耍方法)在这里http://www.geeksforgeeks.org/array-rotation/。令我困惑的是为什么循环次数是n和d的gcd。有没有人通过例子知道证据?
答案 0 :(得分:1)
为什么循环次数是n和d的gcd
所以循环次数完全分开了!如果'c'是所涉及的周期数,那么n应该可以被c完全整除,即n = x c,类似地,d = y c。
现在,在算法中,x是数组中的集合数,y是执行的步数(或迭代次数)。在给定的示例中检查并确认。
选择GCD的主要目的是使x和y为整数而不是某些浮点值。
答案 1 :(得分:0)
基本上开发人员尝试做的是
Tmp = arr[0]
for(i=0; i<n-1;i++){
arr[i*d % n] = arr[(i+1)*d % n]
}
arr[n-1] = arr[d-1]
如果GCD(n,d)= 1,程序运行正常,例如(n,d)=(5,2)
Tmp = arr[0]
arr[0]= arr[2]
arr[2]= arr[4]
arr[4]= arr[1]
arr[1]= arr[3]
arr[3]= arr[5]
但是当GCD(n,d)> 1在这里开始问题时,例子(6,2)
Tmp = arr[0]
arr[0]= arr[2]
arr[2]= arr[4]
arr[4]= arr[0]
arr[0]= arr[2] // probleme because we are not able to go throw each element so we should break from the loop
由于n / GCD(6,2)= 3,我们只能正确地修改前三个元素,所以他在循环中放入了这样一个条件:如果我们回到第一个元素,他会从while中断并增加起始元素为1所以在下一次迭代中他修改了arr [1],arr [3],arr [5]