2000上半年程序员考试真题及答案-下午卷.docVIP

  • 1
  • 0
  • 约9.61千字
  • 约 7页
  • 2021-08-24 发布于北京
  • 举报

2000上半年程序员考试真题及答案-下午卷.doc

2000上半年程序员考试真题及答案-下午卷 试题一(15分)   阅读下列函数说明和 C 代码,将应填入其中__(n)__处的字句写在答卷的对应栏内。 【函数1.1说明】   设链表结点的类型为     typedef struct elem{ int val; struct elem *next; } intNode;   函数 merge(int *a,int *b) 是将两个升序链表 a 和 b 合并成一个升序链表。 【函数1.1】 intNode *merge(intNode *a,intNode *b) { intNode *h = a,*p,*q; while(b) { for (p = h; p p-gtvalltb-gtval; q = p, p = p-gtnext); if (p == h) __(1)__; else __(2)__; q = b; b = b-gtnext; __(3)__; } return h; } 【函数1.2说明】   递归函数 dec(int a[],int n) 判断数组 a[] 的前 n 个元素是否是不递增的。不递增返 回 1 ,否则返回 0 。 【函数1.2】 int dec(int a[],int n) { if (n = 1) __(4)__; if (a[0] a[1]) return 0; return __(5)__; } 试题二(18分) 阅读下列函数说明和 C 代码,将应填入__(n)__处的字句写在答卷的对应栏内。 【函数2.1说明】 设长正整数用数组存储,如有 k 位的长整数m用数组 a[] 存储: m = a[k]*10k-1a[k-1]*10K-2+……+a[2]*101+a[1]*100 并用a[0]存储长整数m的位数,即a[0]=k。 通常,存储长整数数组的每个元素只存储长整数的一位数字。长整数运算时,为了运算方便, 产生的中间结果的某位数字可能会大于 9。这时,就应调用本函数将它规整,使数组的每个元素 只存储长整数的一位数字。规整运算函数 formal(int *a) 就实现这个特殊要求。 【函数2.1】 void formal(int *a) { int p; for (p = 1; p a[0] || a[p] = 10; p++) { if (p = a[0] __(1)__; a[p+1]+ = a[p]/10; a[p] = __(2)__; } if (p a[0]) __(3)__; } 【函数2.2说明】 函数 combine(a,b,c) 是计算两个整数的组合数。由于计算结果超出 long int 的表示 范围,故用本题【函数2.1说明】的方法存储计算结果。设整数 a 和 b (a=b) ,它们的组 合 c(a,b) = a!/((a-b)!*b!)。计算 a 和 b 的组合可采用以下方法: a!/(a-b)!/b! = a*(a-1)*(a-2)*…*(a-b+1)/b! = u1*u2*…*ub/(d1*d2*…*db) 其中u1 = a,u2 = a-1,…,ub = a-b+1;d1 = 1,d2 =2 ,…,db = b 。 从而计算 a 和 b 的组合 c(a,b),可变成计算上述分式。 为计算上述分式,先从 u1,u2,…,ub 中去掉所有 d1*d2*…*db 的因子,得到新的 u1,u2,…,ub。然后再将它们相乘。以下函数中调用的外部函数 gcd(a,b) 是求两整数 a 和 b 最大公因子的函数;函数 formal() 就是本题中的函数 2.1。 【函数2.2】 void combine (int a,int b,int *c) { int i, j, x, k; int d[MAXN],u[MAXN]; for (k = 0, i = a; i = a-b+1; i--) u[++k] = i; __(4)__; for (i = 1; i = b; i++) d[i] = i; /*将整数 1 至 b顺序存于数组

您可能关注的文档

文档评论(0)

1亿VIP精品文档

相关文档