小明想要快速知道任给一个正整数中有多少个奇数位(数位值是奇数),下面的 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。先分析已有代码的功能,确定输出目标,再反推横线处需要的代码。可用代入法验证。
将每个选项代入横线处验证是最可靠的方法。注意代码的完整逻辑和输出格式。
【考点】循环结构|取模运算|奇偶判断|数位处理
命题人卡住的是"奇数位≠奇数"这个概念偷换。题目明确问"数位值是奇数",即数字本身是奇数,而非位置为奇数。绝大多数考生看到"奇数"就条件反射用%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,位置统计得用字符串或取对数。