阅读下列函数说明、图和C代码,将应填入(n)处的字句写在对应栏内。 【说明】 假定用一个整型数组表示一个长整数,数组的每个元素存储长整数的一位数字,则实际的长整数m表示为: m=a[k]×10k-2+a[k-1]×10k-3+…+a[3]

admin2009-02-15  27

问题 阅读下列函数说明、图和C代码,将应填入(n)处的字句写在对应栏内。
   【说明】
   假定用一个整型数组表示一个长整数,数组的每个元素存储长整数的一位数字,则实际的长整数m表示为:
   m=a[k]×10k-2+a[k-1]×10k-3+…+a[3]×10+a[2]
   其中a[1]保存该长整数的位数,a[0]保存该长整数的符号:0表示正数,1表示负数。
   运算时先决定符号,再进行绝对值运算。对于绝对值相减情况,总是绝对值较大的减去绝对值较小的,以避免出现不够减的情况。注:不考虑溢出情况,即数组足够大。
   【函数】
   int cmp(int *LA, int *LB);
   /*比较长整数LA与LB的绝对值大小*/
    /*若LA绝对值较大返回正值,LA较小返回负值,相等则返回0*/
   int ADD(int *LA, int*LB, int *LC)
   /*计算长整数LA与LB的和,结果存储于LC中*/
   /*注意:正数与负数的和相当于正数与负数绝对值的差*/
   /*数据有误返回0,正常返回1*/
   {
         if(LA==NULL || LB==NULL || LC==NULL)return 0;
         int *pA, *pB,i,N,carry,flag;
         flag=LA[0]+LB[0];
         switch(flag){/*根据参与运算的两个数的符号进行不同的操作*/
         case 0:
         case 2:
               LC[0]=LA[0];/*LA与LB同号,结果符号与LA(LB)相同*/
               pA=LA;
               pB=LB;
                 (1)  ;
               break;
         case 1:/*LA与LB异号*/
               /*比较两者的绝对值大小,结果符号与较大者相同*/
               flag=  (2)  ;
               if(flag>0){/*LA较大*/
                     LC[0]=LA[0];
                     pA=LA;
                     pB=LB;
               }
               else if(flag<0){/*LB较大*/
                      LC[0]=LB[0];
                      pA=LB;
                      pB=LA;
               }
               else{/*LA与LB相等*/
                     LC[0]=0;
                     LC[1]=0;
                     return 1;
               }
               flag=-1;
               break;
         default:
               return 0;
               break;
         }/*switch*/
         /*绝对值相加减*/
         /*注意对于减法pA指向较大数,pB指向较小数,不可能出现不够减的情况*/
           (3)  ;
         N=LA[1]>LB[1]?LA[1]:LB[1];
         for(i=0;i<N;i++){
            if(i>=pA[1]){/*LA计算完毕*/
                 carry+=flag *pB[i+2];
           }
           else if(i>=pB[1]){/*LB计算完毕*/
                 carry +=pA[i+2];
           }
           else{
                 carry +=pA[i+2]+flag *pB[i+2];
           }
           LC[i+2]=Carry%10;
           carry /=10;
           if(  (4)  ){/*需要借位,针对减法*/
                    LC[i+2]+=10;
                    carry--;
           }
       }/*for*/
       if(  (5)  ){/*最高进位,针对加法*/
                LC[i+2]=carry;
                i++;
       }
       if(LC[i+1]==0)i--;严若最高位为零,针对减法*/
       LC[1]=i;
       return 1;
   };/*ADD*/
阅读下列函数说明、图和C代码,将应填入  (n)  处的字句写在对应栏内。
1.    【说明】
   假定用一个整型数组表示一个长整数,数组的每个元素存储长整数的一位数字,则实际的长整数m表示为:
   m=a[k]×10k-2+a[k-1]×10k-3+…+a[3]×10+a[2]
   其中a[1]保存该长整数的位数,a[0]保存该长整数的符号:0表示正数,1表示负数。
   运算时先决定符号,再进行绝对值运算。对于绝对值相减情况,总是绝对值较大的减去绝对值较小的,以避免出现不够减的情况。注:不考虑溢出情况,即数组足够大。
   【函数】
   int cmp(int *LA, int *LB);
   /*比较长整数LA与LB的绝对值大小*/
    /*若LA绝对值较大返回正值,LA较小返回负值,相等则返回0*/
   int ADD(int *LA, int*LB, int *LC)
   /*计算长整数LA与LB的和,结果存储于LC中*/
   /*注意:正数与负数的和相当于正数与负数绝对值的差*/
   /*数据有误返回0,正常返回1*/
   {
         if(LA==NULL || LB==NULL || LC==NULL)return 0;
         int *pA, *pB,i,N,carry,flag;
         flag=LA[0]+LB[0];
         switch(flag){/*根据参与运算的两个数的符号进行不同的操作*/
         case 0:
         case 2:
               LC[0]=LA[0];/*LA与LB同号,结果符号与LA(LB)相同*/
               pA=LA;
               pB=LB;
                 (1);
               break;
         case 1:/*LA与LB异号*/
               /*比较两者的绝对值大小,结果符号与较大者相同*/
               flag=(2);
               if(flag>0){/*LA较大*/
                     LC[0]=LA[0];
                     pA=LA;
                     pB=LB;
               }
               else if(flag<0){/*LB较大*/
                      LC[0]=LB[0];
                      pA=LB;
                      pB=LA;
               }
               else{/*LA与LB相等*/
                     LC[0]=0;
                     LC[1]=0;
                     return 1;
               }
               flag=-1;
               break;
         default:
               return 0;
               break;
         }/*switch*/
         /*绝对值相加减*/
         /*注意对于减法pA指向较大数,pB指向较小数,不可能出现不够减的情况*/
           (3);
         N=LA[1]>LB[1]?LA[1]:LB[1];
         for(i=0;i<N;i++){
            if(i>=pA[1]){/*LA计算完毕*/
                 carry+=flag *pB[i+2];
           }
           else if(i>=pB[1]){/*LB计算完毕*/
                 carry +=pA[i+2];
           }
           else{
                 carry +=pA[i+2]+flag *pB[i+2];
           }
           LC[i+2]=Carry%10;
           carry /=10;
           if((4)){/*需要借位,针对减法*/
                    LC[i+2]+=10;
                    carry--;
           }
       }/*for*/
       if((5)){/*最高进位,针对加法*/
                LC[i+2]=carry;
                i++;
       }
       if(LC[i+1]==0)i--;严若最高位为零,针对减法*/
       LC[1]=i;
       return 1;
   };/*ADD*/

选项

答案(1) flag=1 (2) cmp(LA,LB) (3) carry=0 (4) LC[i+2]<0 (5) carry

解析 先来看空(2),依据注释此处是比较LA与LB绝对值的大小,参照cmp函数说明及声明,应填cmp(LA,LB)。
   空(3)以下进行绝对值相加减。carry+=pA[i+2]+flag*pB[i+2];可见,carry需要进行初始化,故空(3)应填carryy=0。仔细[分析] 该计算式,可知flag是符号,flag为1时,计算pA+pB,flag为-1时,计算pA-pB。由此也推断出空(1)应填flag=1。case 1中亦有对应语句flag=-1可得验证。
   由注释可见空(4)要填需要借位的条件。当不够减时需要向高一位借位,也就是不借位时相减结果是负数。因此空(4)应填LC[i+2]<0。
   同(4),空(5)要填需要有最高进位的条件。carry变量表示的就是进位。因此空(5)应填carry(或carry !=0)。注:此处carry不可能为负数。
转载请注明原文地址:https://jikaoti.com/ti/hVi7FFFM
0

随机试题
最新回复(0)