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

C语言区间Armstrong数查找代码调试求助:逻辑错误排查

排查C语言Armstrong数程序的逻辑错误

存在的核心错误分析

  • 位数计算函数逻辑错误
    原digit函数通过pow(10,i)取余判断位数的逻辑完全不成立,且依赖浮点数的pow函数存在精度风险:比如pow(10,2)可能因精度问题返回99.999999,强制转int后变成99,导致153%99=54≠153,循环会错误地继续执行,最终返回错误的位数。正确的位数计算应该用整数除法循环实现。

  • 累加和未初始化
    is_armstrong函数中的sum没有初始化为0,每次调用时sum会是内存中的随机垃圾值,这是153无法被识别的关键原因之一。

  • 硬编码3次方不符合Armstrong数定义
    Armstrong数的定义是每个位上的数字的位数次方之和等于原数,比如1634是4位数,需要计算每个位的4次方之和。原代码固定用pow(b,3),仅能识别3位Armstrong数,且通用性极差。

  • 浮点数函数pow的精度问题
    pow是浮点数运算函数,计算整数幂时可能出现精度误差(比如pow(10,1)可能返回9.999999999),强制转int后会导致后续的取位计算错误。


修正后的代码

#include <stdio.h>

// 计算数字的位数(纯整数运算,无精度问题)
int digit_count(int n) {
    if (n == 0) return 1;
    int count = 0;
    while (n != 0) {
        n /= 10;
        count++;
    }
    return count;
}

// 整数幂运算(替代pow,避免浮点数误差)
int int_power(int base, int exp) {
    int result = 1;
    for (int i = 0; i < exp; i++) {
        result *= base;
    }
    return result;
}

// 判断并输出Armstrong数
void check_armstrong(int n) {
    int original = n;
    int sum = 0;
    int digits = digit_count(n);
    
    while (n != 0) {
        int digit = n % 10;
        sum += int_power(digit, digits);
        n /= 10;
    }
    
    if (sum == original) {
        printf("%d is an armstrong number.\n", original);
    }
}

int main() {
    int a, b;
    printf("Please input the left hand limit of range : \n");
    scanf("%d", &a);
    printf("Please input the right hand limit of range : \n");
    scanf("%d", &b);
    
    // 处理左边界大于右边界的情况
    if (a > b) {
        int temp = a;
        a = b;
        b = temp;
    }
    
    for (int i = a; i <= b; i++) {
        check_armstrong(i);
    }
    
    check_armstrong(153);
    return 0;
}

修正说明

  1. digit_count函数:通过循环除以10计数,彻底避免浮点数带来的精度问题,准确计算数字位数。
  2. int_power函数:用整数循环实现幂运算,完全替代pow函数,消除浮点数误差。
  3. check_armstrong函数:初始化sum为0,用整数运算提取每一位数字,计算对应位数的幂之和,最后与原数比较。
  4. main函数:增加区间边界交换逻辑,避免用户输入左边界大于右边界时程序无有效输出。

内容的提问来源于stack exchange,提问作者goel_tanmay_13

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 08:15:35