You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

程序运行结果时对时错?求排查逆序数整除位数的逻辑问题

逆序数整除位数问题的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;
}

错误点分析

  1. 错误复用原始输入变量n:外层for循环遍历的是i,但内层while循环操作的是原始输入的n,第一次循环后n会被置为0,后续所有循环都无法进入while逻辑,导致只处理了第一个i(n-1)就停止计算,后续数字根本没被检查。
  2. 未重置临时变量:每次检查新数字时,逆序数s和位数a没有重置为0,会累积之前的计算结果,导致后续判断完全错误。
  3. 提前判断条件:在计算逆序数的过程中(while循环内部)就判断s % a == 0,此时逆序数还未完全计算完成,仅靠巧合蒙对了输入50的情况,其他场景必然出错。
  4. 未终止外层循环:即使找到符合条件的数字,外层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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 20:45:35