第三部分,完善程序。第34题-第43题,每题 3 分,共计30分。






程序(1)进制减半
题意:把一个 mn 进制数 A 转为 n 进制。程序按逐位读入的 Horner 思路维护当前前缀的值:每读入一位 x,"前缀 = 前缀 × mn + x"。由于 mn = m×n,乘 mn 可以拆成"数位整体上移一位(位权 ×n)且每位系数 ×m",再用"逢 n 进一"归一化。
第34题【答案】D
【解析】整体上移一位并乘系数 m:b[j] = b[j−1] * m。配合位权 n 相当于整体 ×mn。
第35题【答案】B
【解析】新读入的数位 x 放到最低位:b[0] = x。
第36题【答案】D
【解析】归一化进位:b[j+1] += b[j] / n,把超出 n 的部分进到高位。
第37题【答案】B
【解析】本位留下余数:b[j] = b[j] % n。③④合起来就是"逢 n 进一"。
第38题【答案】C
【解析】输出前去掉高位多余的 0。高位是 b[len−1],且至少要保留 1 位,故条件为 len > 1 && b[len−1] == 0。注意如果写成 len > 0,全零输入会被删空;看错高位下标(b[0])则方向反了。



程序(2)平衡分割
题意:把长度为 n 的十六进制串切成 k 段(1 ≤ k < n,切点 p₁<…<p_k),每段看成十六进制数后取平均,要求段平均值的最大值减最小值尽量小。程序递归枚举每一段的右端点,l 越过="" n="" 时结算;mnb="" mxb="" 维护当前方案里段平均值的最小="" 最大值,cnt="" 记录"真实切点"个数。<="" p="">
第39题【答案】B
【解析】十六进制字符转数值:数字字符减 '0',字母减 'A'−10。写成 c − (c < 'A' ? '0' : 'A' − 10) 两种情况都正确。A 选项对 '9' 判断有漏洞,D 选项减 'A'+10 会得到负数。
第40题【答案】D
【解析】当前段从 l 出发,枚举右端点 r:int r = l; r <= n; ++r,保证每段非空。
第41题【答案】C
【解析】段 [l..r] 的平均值为 sum * 1.0 / (r − l + 1),注意先乘 1.0 转成浮点再除。
第42题【答案】A
【解析】下一段从 r+1 开始;切点位于 r 与 r+1 之间,只有 r < n 时才是真实存在的切点,所以 cnt + (r < n);同时把新段平均值并入:min(mnb, nwb), max(mxb, nwb)。结算时 cnt==0 表示一个切点都没有(k=0),不合法直接返回。
第43题【答案】D
【解析】字符串从下标 1 开始读入,初始 l = 1、cnt = 0;哨兵取"不会拖累第一次 min/max"的值:mnb = 1e100(最小值的初值取正无穷),mxb = −1e100。即 split(1, 0, 1e100, −1e100)。