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

admin2014-10-11  28

问题 阅读以下说明和C代码,将应填入(n)处的字句写在答题纸对应栏内。
【说明】
函数combine(a,b,c)是计算两个整数的组合数。由于计算结果可能超出long整型的可表示范围,故采用数组方式存储,例如: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,这是就应该调用fonnat将其归整,使数组中的每个元素始终只存储长整型的一位数字。整数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 MAXN 100
    int gcd(int a,int b)//求两个整数a和b的最大公因子
    {
    if(a    int c=a;  a=b;  b=c;
    }
    for(int i=b;  i>=2;  i一一){
    if(  (1)  )return i;
    }
    return 1:
    }
    void format(int*a)//将长整型数组归整
    {
    int  i;
    for(i=1;  i  >=1 0;  i++){
    i f(i  >=a[0])    (2)  ;
    a[i+1]  +=a/10;
    a  =a%10;
    }
    if(i>a[0]) (3);
    }
    void combine(inta,  intb,  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[O]j 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归整
    }
    }
    }

选项

答案(1)a%i==0&&b%i==0(2)a[i+1]=0(3)a[0]=i (4)c[0]=1(5)u[i]*c[j]

解析 函数gcd()是用来求最大公约数的,从“if(a=a[0]”的情况下执行的,而for循环条件是“i>=10”,则必然意味着“a>=10”,需要进位调整,而接下来的语句“a[i+1]+=a[i1/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/7Ui7FFFM
0

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