有个无限长的链,由 3 种外形相同但材质不同的环链成。3 种环的重量分别是 $3$、$4$、$6$ 克,相同材质的多个环每 $12$ 克一组,分别记为 G3、G4、G6。链依次 G3、G4、G6、G3、G4、G6、...。同时对链上所有环从头依次编号 $1$、$2$、$3$、$4$……。输入正整数代表环编号,求该编号前所有环(不含该环本身)的重量。下面是 C++ 代码是实现,正确说法是( )。
int N, G, R;
int wc = 0;
cin >> N; // 输入正整数
G = (N - 1) / 9; // L1
R = (N - 1) % 9; // L2:保存余数
wc += 36*G;
if((1 <= R) && (R <= 4))
wc += 3*R; // L3
else if ((5 <= R) && (R <= 7))
wc += 4*R; // L4
else if(R == 8)
wc += 6*(R - 1); // L5
cout << wc << endl;答案D。if-else语句中else与最近的if配对。花括号可以改变匹配关系。
if(a=b)合法但往往不是本意!它执行赋值后判断b的值是否为0。
【考点】整除取余|条件分支|边界处理
GESP二级常考循环与条件分支,本题用整除取余映射分组位置,重点考余数边界处理。命题人卡的是考生对"余数=8时对应第几个环"的直觉偏差——很多人误以为R=8要加多个环,实际R=8仅代表一组中G6的第一个环,必须单独加6克。
解题链:先算完整组数G=(N-1)/9,余数R=(N-1)%9;每组总重3+4+6=13克,但代码中wc+=36*G明显错误,不过选项未涉及。条件分支按R分段:R=1~4时对应G3,每个3克,wc+=3*R正确;R=5~7对应G4,每个4克,wc+=4*R正确;R=8对应G6首环,应wc+=6,但代码写wc+=6*(R-1)导致R=8时加了42克,严重错误。
陷阱拆解:A项错在L1/L2本身逻辑无误,只是常数36不对,题目未要求改这两行;B项L3/L4完全正确;C项L3无需改,只有L5错,因此C错。最阴险处是R=8的分支:若只背"余数分段累加"而不理解R=8仅占一个环,就会误用6*(R-1)。
反命题视角:若把L5改为else if(R==8) wc+=6;即正确。或把题目改成"含该环重量",则wc+=36*G需改为39*G。刷到此类题先问"命题人想考我什么"——余数范围、边界条件、分组计算。