一个数的所有数字倒序排列后这个数的大小保持不变,这个数就是回文数,比如 $101$ 与 $6886$ 都是回文数,而 $100$ 不是回文数。以下程序代码用于判断一个数是否为回文数,横线处应填写?( )
int n,a,k;
cin >> n;
a = 0;
k = n;
while (n > 0){
a = _________; // 在此处填写代码
n /= 10;
}
if (a == k)
cout << "是回文数";
else
cout << "不是回文数";这题考的是数字反转的核心算法:取模得个位,乘十位左移。拿到题先想循环里n怎么变(右移),a怎么变(左移加新位),代入初始值验证就能锁定答案。
很多同学在判断回文数时容易混淆位值原理,看到n%10就本能地想直接相加(选项B),却忘了十进制里每一位都有权重,必须乘10左移才能把新数字拼到末尾。另外,选项C和D用了n/10,这是取十位及以上的数字,逻辑完全错误。还有些同学会纠结循环条件是否包含0,导致死循环,但本题while(n>0)本身没问题,主要是横线处的表达式写错。
这道题属于GESP二级"循环与条件"中"循环中的累加操作"这一讲。命题人特意在"数字提取与累加"这个点上挖坑:80%的考生看到n%10就条件反射地选加法,却忽略了十进制位值原理要求先左移(乘10)。这种混淆是二级学生最容易栽跟头的地方,因为题目表面看只是填空,实则考的是对整数运算本质(取模得个位、乘十位左移)的理解,而非简单的语法记忆。
拿到题先想:循环里n怎么变?条件while(n>0)保证n不断右移(n/=10),每次取走一个数字。那a怎么变?a初始为0,每次要把n的个位"拼"到a的末尾。十进制里,"拼到末尾"就是左移一位再相加:先乘10腾出个位空间,再加n%10。所以横线处必须是10*a + n%10。