阅读下列程序说明和C程序,把应填入其中(n)处的字句,写在对应栏内。 【程序说明】 对角线下元素全为0的矩阵称为上三角矩阵,设对于一个n×n的上三角矩阵a,为节约存贮,只将它的上三角元素按行主序连续存放在数组b中。下面的函数trans在不引入工作

admin2009-05-15  40

问题 阅读下列程序说明和C程序,把应填入其中(n)处的字句,写在对应栏内。
  【程序说明】
   对角线下元素全为0的矩阵称为上三角矩阵,设对于一个n×n的上三角矩阵a,为节约存贮,只将它的上三角元素按行主序连续存放在数组b中。下面的函数trans在不引入工作数组的情况下,实现将a改为按列主序连续存放在数组b中。
   设n=5,
   
   b=(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15)
   经调用trans函数后,b变为
   b=(1,2,6,3,7,10,4,8,11,13,5,9,12,14,15)
   函数tans对数组元素的存贮位置作调整。调整过程中存在若干个循环传送链:
   b(i1)→b(i2)→b(ij)→b(i1)1≤j<n
   例如,考察调整后的数组元素b(2)(值为6),与该元素相关的位置调整将形成下面的循环传送链:
   b(2)→b(3)→b(6)→……→b(12)→b(9)→b(5)→b(2)
   关键是确定循环传送链的下标i1,i2,…,ij,以及在考察调整后的元素b(k)(k;3,4,…)时能判定b(k)是已被传送过的某传送链上的元素。
   函数ctr(k,n)计算调整后的数组b的第k个元素b(k)在原数组b中的位置,该位置作为函数ctr(k,n)的返回值。函数ctr根据k确定它在矩阵中的行号i和列号j(注意行号和列号均从 0算起),然后按矩阵存放原则计算出它在b中的位置。
   【程序】
   trans(b,n)
   int n,b[]
   {
       int m,k,r,cc,rr;
       int w;
       m=(n+1)*n/2-4;
       k=2;
       while(m>0)
       {
           r=ctr(k,n);
           if(r==k)
           m--;
           else
           {
               cc=k;rr=r;
               while  (1)  
               {
                   cc=rr,rr=ctr(cc,n);
               }
               if  (2)  
               {
                   cc=k;rr=r;w=b[k];
                   while  (3)  
                   {
                       b[cc]=b[rr];m--;
                       cc=rr,rr=ctf(cc,n);
                   }
                   b[cc]-w;  (4);
               }
           }
           k++;
       }
   }
   ctr(  k,n  )
   int k,n
   {
       int i,j;
       i=k;j=0;
       while  (5)  
       i - =++j  ;
       return(i*n+j-i*(i+1)/2);
   }

选项

答案(5)i>j

解析 循环至i大于等于j停止,此时i、j分别是第k个元素的行号和列号。
转载请注明原文地址:https://jikaoti.com/ti/lwW7FFFM
0

相关试题推荐
随机试题
最新回复(0)