阅读以下说明和C代码,将应填入(n)处的字句写在对应栏内。 [说明] 函数combine(a,b,c)是计算两个整数的组合数。由于计算结果可能超出10ng整型的可表示范围,故采用数组方式存储,例如:k位长整数m用数组c[]存储结构如下:m=

admin2010-12-17  29

问题 阅读以下说明和C代码,将应填入(n)处的字句写在对应栏内。
   [说明]
   函数combine(a,b,c)是计算两个整数的组合数。由于计算结果可能超出10ng整型的可表示范围,故采用数组方式存储,例如:k位长整数m用数组c[]存储结构如下:m=c[k]×10k-1+c[k-1]×10k-2+…+c[2]×10+c[1],利用c[0]存储长整数m的位数,即c[0]=k。数组的每个元素只存储长整数m的一位数字,长整数运算时,产生的中间结果的某位数字可能会大于9,这是就应该调用format将其归整,使数组中的每个元素始终只存储长整数的一位数字。
   整数a和b(a>b)的组合数为:,其中u1=a,u2]=a-1,…,ub=a-b+1,d1=1,d2=2,…,db=b。为了计算上述分式,先从u1,u2,…,ub中去掉d1×d2×…×db的因子,得到新的u1,u2,…,ub,然后再将它们相乘。
   [函数]
   #define NAXN 100
   int gcd(int a,int b)//求两个整数a和b的最大公因子
   {
   if(a<b){
   intC=a;a=b;b=c;
   }
    for(inti=b;i>=2;i--){
   if(  (1)  )return i;
   }
   return 1;
   void format(int *a)//将长整数数组归整
   {
   int i;
   for(i=1;i<a[0]||a>=10;i++){
   if(i>=a[0])  (2);
   a[i+1]+=a/10;
   a=a%10;
   }
   if(i>a[0])  (3);
   }
   void combine(int a,int b,int *C)
   {
   int i,J,k,x;
   int d[MAXN],u[MAXN];
   k=0;
   for(i=a;i>=a-b+1;i--)u[++k]=i;
   u[0]=b;
   for(i=1;i<=b;i++)d=i;
   for(i=1;i<=u[0];i++){//从u中各元素去掉d中整数的因子
   for(j=1;j<=b;j++){
   x=gcd(u,d[j]);//计算最大公约数
   u/=X;
   d[j]/=x;
   }
     (4);C[1]=1;//长整数c初始化
   for(i=1;i<=u[0];i++)(//将u中各整数相乘,存于长整数c中
   if(u!=1){
   for(j=1;j<=c[0];j++){
   C[j]=(5);
   }
   format(C);//将长整数c归整
   }
   }
   }
(5)

选项

答案u[i]*c[j]

解析 函数gcd()是用来求最大公约数的,从“if(a<b)”块的代码可知,a存储的是较大数,求最大公约数就从b开始往下试探,当某个整数i第一次既能整除a又能整除b,则说明i即为a与b的最大公约数。故空(1)应填“a%i==0&&b%i==0”。
    空(2)是在条件“i>=a[0]”的情况下执行的,而for循环条件是“i,a[0]||a>=10”,则必然意味着“a>=10”,需要进位调整,而接下来的语句“a[i+1]+=a/10”暗示此时a[i+1]需要赋初值0。故空(2)应填“a[i+1]=0”。
   执行到空(3)调整已经结束,若if条件“i>a[0]”成立意味着整数归整后,位数已经突破了原来的a[0],需要调整为当前的位数。故空(3)应填“a[0]=i”。
   空(4)是初始化长整数c的,接下来的是乘法操作,因此初始化为1,即c[1]=1,显然应该将c[0]也初始化为1。故空(4)应填“c[0]=1”。
   从注释知空(5)所在的二重循环是将u中的各整数相乘存入c中,需要将c的每一位与u的每一位相乘,故空(5)应填“u*c[j]”。
转载请注明原文地址:https://jikaoti.com/ti/09i7FFFM
0

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