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

如何正确计算数字的Armstrong值?C语言代码调试求助

判断Armstrong数的代码错误修复

问题背景

需要判断一个数是否为Armstrong数(即数字每一位取该数位数的幂次后求和等于原数,例如9474:9⁴ + 4⁴ +7⁴ +4⁴=9474),原代码使用digitcount统计位数、b存储Armstrong值,但输入9474时出现“Invalid value on assignment”错误,原代码如下:

#include <stdio.h>
void main(){
    int b,remainder, digitcount, i, j;
    digitcount = 0;
    printf("Enter a value for i: ");
    scanf("%d", &i);
    b = 0;
    remainder = 1;
    while (i != 0){
        i = i/10;
        ++digitcount;
    }
    printf("%d", digitcount);
    for (j = 1; j <= digitcount; j++){
        while (i != 0){
            while (digitcount != 0){
                remainder = (i % 10)*= digitcount;
                b = b+remainder;
                i = i/10;
                digitcount--;
            }
        }
    }
    printf("%d", b);
    
} 

错误分析

  1. 原数被破坏:统计位数的while循环中,i = i/10执行到最后i变成0,后续计算Armstrong值时,所有依赖i的循环都不会执行。
  2. 语法错误:remainder = (i % 10)*= digitcount;是非法赋值,*=是复合运算符,不能嵌套在赋值语句里,而且逻辑错误——需要计算的是数字的digitcount次幂,不是乘以digitcount。
  3. 循环逻辑混乱:多层while+for循环完全冗余,逻辑上不需要这么多嵌套。
  4. 非标准入口:void main不符合C标准,应该使用int main()并返回0。

修正后的代码

#include <stdio.h>
#include <math.h> // 用于pow函数计算幂次

int main(){
    int original_num, b, remainder, digitcount, temp;
    digitcount = 0;
    printf("Enter a value: ");
    scanf("%d", &original_num);
    temp = original_num; // 用临时变量统计位数,保留原数
    
    // 统计数字的位数
    while (temp != 0){
        temp = temp / 10;
        ++digitcount;
    }
    
    b = 0;
    temp = original_num; // 重置临时变量,用于拆分每一位
    while (temp != 0){
        remainder = temp % 10;
        // 计算当前位的digitcount次幂并累加到b
        b += pow(remainder, digitcount);
        temp = temp / 10;
    }
    
    // 判断是否为Armstrong数
    if (b == original_num){
        printf("%d 是Armstrong数\n", original_num);
    } else {
        printf("%d 不是Armstrong数\n", original_num);
    }
    
    return 0;
}

额外说明

如果不想使用math.h的pow函数,可以自己写一个幂次计算的循环,避免链接数学库:

// 替换b += pow(remainder, digitcount);为以下代码
int power = 1;
for(int k=0; k<digitcount; k++){
    power *= remainder;
}
b += power;

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 08:35:21