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

C语言阿姆斯特朗数判断代码故障:所有输入均返回非阿姆斯特朗数

阿姆斯特朗数判断代码的问题修复

你的代码有三个核心问题,导致无论输入什么数字都返回“not armstrong”,下面逐一说明并给出修复方案:

1. 变量重复定义导致sum值异常

在check_armstrong函数中,你先在函数开头声明了int sum;,又在for循环的初始化部分重新定义了int sum = 0;。循环内的sum是局部于循环的变量,循环结束后,函数上层的sum仍是未初始化的垃圾值,和输入数字比较永远不相等,因此始终返回false。

修复方式:删除循环内的int关键字,在函数开头直接初始化sum:

bool check_armstrong(int num, int num_length)
{ 
    int sum = 0; // 移到此处初始化
    int digit = 0;
    int temp_num = num; 
    for (; temp_num != 0;) // 移除循环内的int sum定义
    {
        digit = temp_num % 10; 
        temp_num /= 10; 
        sum += pow(digit, num_length); 
    }

    return sum == num;
}

2. pow函数的精度误差问题

pow是返回double类型的数学库函数,计算整数幂时可能出现精度偏差。比如pow(3,3)可能返回26.9999999999,强制转换为int后会变成26,而非预期的27,导致sum计算错误。

修复方式:实现一个整数幂计算函数替代pow:

// 新增整数幂计算函数
int int_power(int base, int exp)
{
    int result = 1;
    for (int i = 0; i < exp; i++)
    {
        result *= base;
    }
    return result;
}

然后在check_armstrong中替换pow调用:

sum += int_power(digit, num_length);

3. 未处理输入为0的情况

count_digits函数在输入为0时会返回0,但0是阿姆斯特朗数(0^1=0),此时代码会错误判断它不是。

修复方式:修改count_digits函数,单独处理num为0的情况:

int count_digits(int num)
{
    if (num == 0)
        return 1;
    int count;
    for (count = 0; num != 0; count++)
    {   
        num /= 10;
    }
    return count;
}

修复后的完整代码

#include <stdio.h>
#include <conio.h>
#include <stdbool.h>

int count_digits(int num)
{
    if (num == 0)
        return 1;
    int count;
    for (count = 0; num != 0; count++)
    {   
        num /= 10;
    }
    return count;
}

int int_power(int base, int exp)
{
    int result = 1;
    for (int i = 0; i < exp; i++)
    {
        result *= base;
    }
    return result;
}

bool check_armstrong(int num, int num_length)
{ 
    int sum = 0;
    int digit = 0;
    int temp_num = num; 
    for (; temp_num != 0;) 
    {
        digit = temp_num % 10; 
        temp_num /= 10; 
        sum += int_power(digit, num_length); 
    }

    return sum == num;
}

int main()
{
    int input_num;
    printf("Enter a number: ");
    scanf("%d", &input_num);
    
    if (check_armstrong(input_num, count_digits(input_num)))
    {
        printf("It is an armstrong number.");
    }
    else
    {
        printf("It is not an armstrong number.");
    }

    getch();
    return 0;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 00:52:53