如何正确计算数字的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); }
错误分析
- 原数被破坏:统计位数的while循环中,
i = i/10执行到最后i变成0,后续计算Armstrong值时,所有依赖i的循环都不会执行。 - 语法错误:
remainder = (i % 10)*= digitcount;是非法赋值,*=是复合运算符,不能嵌套在赋值语句里,而且逻辑错误——需要计算的是数字的digitcount次幂,不是乘以digitcount。 - 循环逻辑混乱:多层while+for循环完全冗余,逻辑上不需要这么多嵌套。
- 非标准入口:
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
相关产品推荐
相关产品推荐

