在编程入门练习里,统计一个整数中输入数字为偶数的个数是一个常见题目。不少同学直接用整数除法循环除以10来逐位处理,却可能在边界条件下漏掉最高位,导致统计结果偏小。下面先通过示例说明问题根源,再给出稳妥写法。

为什么整数除法会丢失首位
假设我们输入数字为 1234,希望统计其中偶数数字 2 和 4 的个数。若用如下逻辑:
#include <iostream>
using namespace std;
int main() {
int n = 1234;
int count = 0;
while (n > 0) {
int digit = n % 10; // 取末位
if (digit % 2 == 0) {
count++;
}
n = n / 10; // 去掉末位
}
cout << count << endl;
return 0;
}
上述代码其实能正确统计 1234 中的偶数位。但在某些变体中,开发者会先写 n = n / 10 再取模,或在判断条件上误用整数除法结果,就可能跳过首位。例如下面错误写法:
n = 1234
count = 0
while n > 0:
n = n // 10 # 先整除,末位被丢弃
if n % 2 == 0: # 此时取的是新末位,原首位永远碰不到
count += 1
print(count)
这种顺序错误会让原数字的最高位在第一次循环就被除掉,永远无法参与判断。
避免首位丢失的可靠方法
方法一:先转字符串再统计
把数字当成字符序列处理,每一位都不会因除法消失,逻辑最直观:
s = input().strip() # 输入如 123456
count = 0
for ch in s:
if ch.isdigit() and int(ch) % 2 == 0:
count += 1
print(count)
方法二:正确顺序的取模循环
若坚持用数值拆分,务必先取模获得当前末位,再执行整除:
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int count = 0;
while (n > 0) {
int d = n % 10; // 先取末位
if (d % 2 == 0) {
count++;
}
n = n / 10; // 后去掉末位
}
System.out.println(count);
}
}
小结
统计偶数数字个数时,核心是保证每一位都被访问到。字符串法最简单且不怕首位丢失;数值法只要坚持先取模后整除,也能得到正确结果。避免在一开始就做整数除法而把高位吞掉,就能彻底解决首位丢失问题。