[原创]30分钟全对的送80[高手莫笑]
30分钟内全对送80.做了,但是一个空都没对我也送他10.送完即止(没功劳有苦劳,但是要认真哦.呵呵,应该很少人连一个空都做不吧.认真点看。不是很难的)
函数说明: 函数void rcr(int a[],int n,int k)的功能是:将数组a中的元素a[0]~a[n-1]循环向右平移k个位置。为了达到总移动次数不超过n的要求。每个元素都必须只经过一次移动到达目标位置,在函数rcr中用如下算法实现:首先备份a[0]的值,然后计算机应移动到a[0]的元素的下标p,并将a[p]的值移至a[0];接着计算应该移动到a[p]的元素下标的q,并将a[q]的值移至a[p];依次类推,直到将a[0]的备份的值移到正确位置。
若此时移到的下标元素个数已经为n,则结束;否则,在备份a[1]的值,然后计算应该移到的a[1]的元素下标p,并将a[p]的值移至a[1];接着计算应该移动到a[p]的元素下标q。并将a[q]的值移至a[p];依次类推,直到将a[1]备份的值移到正确位置。
若此时移动到的元素个数已经为n,则结束;否则从a[2]开始。重复上述过程,直至将所有元素有移动到目标位置为止。
例如,数组a中的6个元素,图3-4所 示,循环向右平移2个位置后的元素的排列情况。如图3-5所示。
#include<stdio.h>
void rcr(int a[],int n,int k)
{int i,j,t,temp,count;
count=0;
k=k%n;
if(______(1)________)
{i=0;
while(count<n)
{j=i;t=i;
temp=a[i];
while((j=(________(2)_______)!=i)
{a[t]=a[j];
t=_________(3)________;
count++;
}
______(4)_________=temp;
count++;
_______(5)_______;
}
}
}
答案在后面