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

Armstrong数识别代码异常:每次判定为非Armstrong数

问题分析与修复

你的代码存在两个核心问题,导致无法正确判定Armstrong数:

  1. 位数统计时修改了原始num的值
    第一个循环用于统计数字位数,但直接修改了num,导致后续求和循环只能处理剩下的最后一位数字,而非原始数字的所有位数。例如输入153,统计位数后num会变成1,求和循环仅计算1³,完全遗漏了5³和3³。

  2. pow()函数的浮点精度误差
    pow()是浮点运算函数,返回的double类型值可能存在精度偏差。比如pow(5,3)可能返回124.999999999而非精确的125,强制转换为int时会被截断为124,直接导致求和结果错误。


修复后的代码
#include <stdio.h>

// 手动计算整数幂,彻底避免浮点精度问题
int integer_power(int base, int exponent) {
    int result = 1;
    for (int i = 0; i < exponent; i++) {
        result *= base;
    }
    return result;
}

int main() {
    int num, original_num, sum = 0, lastdigit, digit_count = 0;

    printf("Enter the number: ");
    scanf("%d", &num);

    original_num = num;

    // 使用临时变量统计位数,不修改原始num
    int temp_num = num;
    while (temp_num != 0) {
        digit_count++;
        temp_num /= 10;
    }

    // 重置num为原始值,开始逐位求和
    num = original_num;
    while (num > 0) {
        lastdigit = num % 10;
        sum += integer_power(lastdigit, digit_count);
        num /= 10;
    }

    if (original_num == sum) {
        printf("The number is an ARMSTRONG number\n");
    } else {
        printf("The number is not a ARMSTRONG number\n");
    }

    return 0;
}

修复说明
  • 位数统计优化:用临时变量temp_num统计位数,保留原始num的值用于后续求和。
  • 整数幂实现:自定义integer_power函数通过循环计算整数幂,完全规避浮点运算的精度问题。
  • 逻辑修正:确保求和循环遍历原始数字的每一位,计算所有位的幂次和。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 23:10:56