阅读下列函数说明和C代码,将应填入(n)处的字句写在对应栏内。 【说明】 函数void rcr(int a[],int n,int k)的功能是:将数组a中的元素s[0]~9[n-1]循环向右平移k个位置。 为了达到总移动次数不超过n的要求,每

admin2009-02-15  34

问题 阅读下列函数说明和C代码,将应填入(n)处的字句写在对应栏内。
【说明】
   函数void rcr(int a[],int n,int k)的功能是:将数组a中的元素s[0]~9[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]的值移至9[1];接着计算应移动到a[p]的元素的下标q,并将a[q]的值移至a[p];依次类推,直到将a[1]的备份值移到正确位置。
   若此时移动到位的元素个数已经为n,则结束;否则,从a[2]开始,重复上述过程,直至将所有的元素都移动到目标位置时为止。
   例如,数组a中的6个元素如图1(a)所示,循环向右平移两个位置后元素的排列情况如图1(b)所示。

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[1];  /*备份a的值*/
        /*移动相关元素,直到计算出a应移动到的目标位置*/
        while((j=(2))! =i){
          a[t]=a[j];
          t=(3);
          count++;
        }
         (4)= temp;count ++;
         (5);
        }
     }
   }

选项

答案(1)k或k!=0 (2)(j-k+n)%n或(t-k+n)%n (3)j (4)a[t]或等价表达式 (5)i++或等价表达式

解析 (1)判断k执行k=k%n后是否为0,即是否是n的倍数,应填入k或k!=0。(2)j表示要移动到a[t]的元素的位置,于是j和t的关系为j=(t-k+n)%n;当执行完j=i,t=i后,j=t,于是此处可填入(j-k+n)%n或(t-k+n)%n。(3)将a[j]移动到a[t]后,需要将 t指向j,即此处填入j。(4)将暂存在temp中的值移动到a[t]中。即此处填入a[t]或等价表达式。(5)此处while循环的递增条件,显然应该是i++或其他等价表达式。
转载请注明原文地址:https://jikaoti.com/ti/eTW7FFFM
0

最新回复(0)