GESP 一级 · GESP 202603 C++ 一级 第 15 题

选择题 · 答案 A · 考点:循环结构

← 整套速查表 GESP 一级 全部真题

题目

$N$ 是一个正整数。如果 $N$ 的所有奇数位的数位和等于所有偶数位的数位和,则称它是一个“双螺旋数”。例如 12375 的所有奇数位的数位和是 9,同时它的所有偶数位的数位和也是 9,则 12375 就是一个双螺旋数。下面的 C++ 代码用于判断输入的 $N$ 是否为双螺旋数。空白处应该填入的代码是( )。

int i, N, N1=0, N2=0, N0;
cin >> N;
N0 = N;
while (N){
    ________
    ________
}
if(N1 == N2)
    cout << N0 << "是双螺旋数" << endl;

A.

N1 += N%10, N /= 10;
N2 += N%10, N /= 10;

B.

N1 += N/10, N /= 10;
N2 += N/10, N /= 10;

C.

N1 += N%10, N %= 10;
N2 += N%10, N %= 10;

D.

N1 += N/10, N %= 10;
N2 += N/10, N %= 10;
答案:A

考点

循环结构

解题思维

答案A。while循环先判断条件再执行,可能一次都不执行。do-while至少执行一次。

常见错误

while先判断后执行,可能0次。do-while先执行后判断,至少1次。

详细解析(节选)

【考点】循环结构|十进制数位处理|奇偶位交替累加

1. 考纲定位:GESP 一级 C++ 循环与数位基础。命题人卡住的是学生混淆"取个位"与"取高位"的操作,以及循环中交替累加的顺序。这个陷阱在一级试卷里出现频率极高。

2. 解题思维:先明确"奇数位"指从右数第 1、3、5…位,"偶数位"指第 2、4、6…位。循环中每次 N/=10 去掉个位,因此第一个 N%10 必是奇数位,第二个必是偶数位。代码必须按"奇位累加→除 10→偶位累加→除 10"顺序执行,才能正确分离两类数位和。

3. 陷阱拆解:B 用 N/10 累加,实际把十位及以上数加进去,完全跑偏;C、D 用 N%=10 更新 N,会反复把 N 变成个位数,循环无法正常推进。A 是唯一正确写法:先 N1 += N%10(奇位),N/=10;再 N2 += N%10(偶位),N/=10。若只背"取个位用%10",却忽视 N/=10 的更新时机,就会误选 C 或 D。

4. 反命题思维:若把"奇数位和等于偶数位和"改成"所有数位和是否为偶数",只需 N1 += N%10; N/=10; 循环结束判断 N1%2==0。刷到类似题,先问"命题人想考我什么"——这里考的是数位位置与循环更新顺序的对应关系,而非单纯取个位。

同考点真题

在 OI伴学 里做这道题
登录后可计时作答、查看完整六段式解析,并按你的错题自动生成同类练习。
去刷题先做一次 AI 学情诊断