程序运行结果时对时错?求排查逆序数整除位数的逻辑问题
逆序数整除位数问题的C程序错误排查与修复
需求概述
- 输入一个大于9的自然数n,找出小于n的最大自然数,要求该数的逆序数能被自身位数整除
- 若输入数字≤9,输出提示
Brojot ne e validen
原始代码
#include <stdio.h> int main() { int n,r,s=0,a=0; int m; scanf("%d",&n); int t=n; if(t<10) { printf("Brojot ne e validen");} else { for (int i = n - 1; i > 0; i--) { while (n != 0) { r = n % 10; s = (s * 10) + r; n = n / 10; a++; if (s % a == 0) { m = i; break; } } } printf("%d\n", m); } return 0; }
错误点分析
- 错误复用原始输入变量n:外层for循环遍历的是
i,但内层while循环操作的是原始输入的n,第一次循环后n会被置为0,后续所有循环都无法进入while逻辑,导致只处理了第一个i(n-1)就停止计算,后续数字根本没被检查。 - 未重置临时变量:每次检查新数字时,逆序数
s和位数a没有重置为0,会累积之前的计算结果,导致后续判断完全错误。 - 提前判断条件:在计算逆序数的过程中(while循环内部)就判断
s % a == 0,此时逆序数还未完全计算完成,仅靠巧合蒙对了输入50的情况,其他场景必然出错。 - 未终止外层循环:即使找到符合条件的数字,外层for循环仍会继续遍历更小的数,最终
m会被后续的i覆盖,导致结果不是最大的符合条件的数。
修复后的代码
#include <stdio.h> int main() { int n, m = -1; scanf("%d", &n); if (n <= 9) { printf("Brojot ne e validen"); return 0; } // 从n-1开始遍历,找最大符合条件的数 for (int i = n - 1; i > 0; i--) { int temp = i; int reverse = 0; int digits = 0; // 计算当前数的逆序数和位数 while (temp != 0) { reverse = reverse * 10 + temp % 10; temp /= 10; digits++; } // 判断逆序数是否能被位数整除 if (reverse % digits == 0) { m = i; break; // 找到最大的,直接退出循环 } } printf("%d\n", m); return 0; }
修复说明
- 每次遍历
i时,用临时变量temp保存i,避免修改遍历变量,同时不影响原始输入n。 - 每次计算前重置
reverse(逆序数)和digits(位数)为0,确保每个数字的计算独立。 - 完整计算逆序数和位数后,再进行条件判断,保证逻辑正确性。
- 找到符合条件的数字后立即break外层循环,确保得到的是小于n的最大符合条件的数。
测试验证
- 输入50 → 输出49(正确)
- 输入100 → 输出89(正确,89的逆序数是98,位数2,98%2=0)
- 输入17 → 输出7(正确,7是小于17的最大数,逆序数7,位数1,7%1=0)
内容的提问来源于stack exchange,提问作者Kratos1919
相关产品推荐
相关产品推荐

