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

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

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

题目

小明想要快速知道任给一个正整数中有多少个奇数位(数位值是奇数),下面的 C++ 代码是其实现,横线处应该填入的代码是( )。

int N;
cin >> N;

int odd_count = 0;  // 记录奇数的个数
int old_number = N; // 保存原数

while (N != 0){
    if (_____________)
        odd_count += 1;
    N = (N - N % 10) / 10;
}
cout << old_number << "中共有 " << odd_count << " 个奇数";
答案:B

考点

循环结构

解题思维

答案B。先分析已有代码的功能,确定输出目标,再反推横线处需要的代码。可用代入法验证。

常见错误

将每个选项代入横线处验证是最可靠的方法。注意代码的完整逻辑和输出格式。

详细解析(节选)

【考点】循环结构|取模运算|奇偶判断|数位处理

命题人卡住的是"奇数位≠奇数"这个概念偷换。题目明确问"数位值是奇数",即数字本身是奇数,而非位置为奇数。绝大多数考生看到"奇数"就条件反射用%2,但容易把"奇数位"自动脑补成"位置为奇数",这就是陷阱核心。

解题思维链:while(N!=0)是经典逐位提取结构。N%10取出最低位,(N-(N%10))/10去掉最低位,循环体只需判断当前取出的位是否为奇数。奇数判断就是%2==1,所以横线填N%10%2==1。通法:当需要逐位处理数字时,先用N%10取当前位,再用N/10(或N=(N-(N%10))/10)去掉当前位,循环继续。

陷阱拆解:A选项N%10%2==0是偶数条件,统计反了;C/D试图用除法判断,但N%10已经取出了最低位,再用N/10就丢失了信息,逻辑完全错误。最阴险的是"奇数位"这个表述,命题人故意用"奇数"而非"奇数位"来掩盖真实意图,如果你只背"奇数判断是%2==1"而不理解题目语义,就会选错。

反命题思维:若改成"判断数位位置是奇数",则需先转字符串或用log10判断位置奇偶,难度直接升一级。刷到"数位统计"类题,先问自己:是统计值还是统计位置?值统计用%10,位置统计得用字符串或取对数。

同考点真题

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