题库 题库

【简答题】

试题四
阅读下列函数说明和C代码,将应填入__(n)__处的字句写在答题纸的对应栏内。
[函数4说明]
函数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个元素如下图(a)所示,循环向右平移2个位置后元素的排列情况如图(b)所示。
 
412538476576 657641253847
a[0]a[1]a[2]a[3]a[4]a[5] a[0]a[1]a[2]a[3]a[4]a[5]
                  (a)                                     (b)
[函数4]
void rcr(int a[],int n,int k)
{
 int i,j,t,temp,count;
 count = 0; /*记录移动元素的次数*/
 k = k % n;
 if(__(1)__){ /*若k是n的倍数,则元素无须移动;否则,每个元素都要移动*/
  i = 0;
  while(count < n) {
   j = i; t = i;
   temp = a[i]; /*备份a[i]的值*/
   /* 移动相关元素,直到计算出a[i]应移动到的目标位置*/
   while((j = __(2)__) != i){
    a[t] = a[j];
    t = __(3)___;
    count++;
   }
   __(4)___ = temp; count++;
   __(5)___;
  }
 }
}

参考答案

(1) k != 0 或 k
(2) (j-k+n) % n
(3) j
(4) a[t] 或 *(a+t)
(5) i++

相关试题