1. 阅读下列函数说明、图和C代码,将应填入
(n) 处的字句写在对应栏内。
【说明】
假定用一个整型数组表示一个长整数,数组的每个元素存储长整数的一位数字,则实际的长整数m表示为:
m=a[k]×10
k-2+a[k-1]×10
k-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[1+2];可见,carry需要进行初始化,故空(3)应填carry=0。仔细分析该计算式,可知flag是符号,flag为1时,计算pA+pB,flag为-1时,计算pA-pB。由此也推断出空(1)应填flag=1。case 1中亦有对应语句flag=-l可得验证。
由注释可见空(4)要填的是需要借位的条件。当不够减时需要向高一位借位,也就是不借位时相减结果是负数。因此空(4)应填LC[i+2]<0。
同(4),空(5)要填需要有最高进位的条件。carry变量表示的就是进位。因此空(5)应填carry(或carr!=0)。注此处carry是不可能为负数。