想要计算从数字 $n$ 到数字 $m$ 之间(包含 $n$ 和 $m$ )有多少个数字 $d$ 出现,下列程序哪个能够实现( )。
A.
int n, m, res, d;
cin >> n >> m >> d;
for (int i = n + C1; i <= m; i++) {
int temp = i;
while (temp) {
if (temp % 10 == d) res++;
temp /= 10;
}
}
cout << res << endl;
return 0;B.
int n, m, res, d;
cin >> n >> m >> d;
for (int i = n; i <= m; i++) {
int temp = i;
while (temp) {
if (temp % 10 = d) res++;
temp /= 10;
}
}
cout << res << endl;
return 0;C.
int n,m,res=0,d; cin >> n >> m>>d; for(int i = n; i <= m; i++){ int temp = i; while(temp){ if(temp % 10 == d) res++; temp /= 10; } } cout << res << endl; return 0;
D.
int n,m,res=0,d; cin >> n >> m>>d; for(int i = n; i <= m; i++){ while(temp){ if(temp % 10 == d) res++; temp /= 10; } } cout << res << endl; return 0;
答案C。数组和位运算的代码追踪要特别小心:数组下标从0开始,位运算结果可能不直观。建议画图辅助。
位运算追踪时建议把数字写成二进制形式再逐位计算。
【考点】循环控制|数字位处理|变量初始化
命题人想考的是"逐位判断"的基础流程。核心逻辑链:初始化计数变量→外层循环遍历区间→内层循环提取个位→比较是否匹配→累加计数。
逐个选项拆解:
n + C1直接跳过n,区间遗漏必错temp % 10 = d是赋值而非比较,所有数字都会误判为匹配temp,变量未初始化必崩溃命题人埋了三个典型坑:区间边界(A)、比较符混淆(B)、变量未初始化(D)。学生如果只背"for 循环 + while 除取余"模板,就会忽略初始化res=0和检查i <= m的正确性。
反命题思维:如果把这道题改成"统计区间内能被 d 整除的数",核心逻辑变成if (i % d == 0) res++;,考察点转向模运算;若改成"区间总位数",则需累加i的位数,考察点转向位运算。刷到类似题时,先问自己"命题人想考我什么"。