如何用Bash打印1-1000的阿姆斯特朗数 现有代码运行报错求助
错误定位
len变量未在每次外层循环开始前重置:len=0定义在全局,每次计算完上一个数字的位数后值会持续累加,后续数字的位数计算完全错误,数值越来越大。你遇到的integer expression expected错误就是因为len溢出了部分解释器的整数判断范围,同时过大的len导致内层循环执行次数指数级增长,脚本无法终止。
- 幂次计算逻辑缺失:当前用于计算位数幂的
for (( j=1;j<=$len;j++ ))是空循环,没有实现当前位数字^位数的计算,mul永远是初始值1,sum的计算完全不符合阿姆斯特朗数的规则。
- 幂次计算逻辑缺失:当前用于计算位数幂的
- Shebang语法错误:首行脚本声明少了感叹号,正确写法是
#!/bin/bash,错误声明会导致系统无法正确调用Bash解释器执行,部分语法会报错。
- Shebang语法错误:首行脚本声明少了感叹号,正确写法是
- 遍历范围错误:需求是打印1到1000范围内的阿姆斯特朗数,当前外层循环只设置了
start<=100,范围不符合需求。
- 遍历范围错误:需求是打印1到1000范围内的阿姆斯特朗数,当前外层循环只设置了
修复后完整代码
#!/bin/bash for (( start=1; start<=1000; start++ )) do # 每次计算新数字前重置位数 len=0 cl_no=$start # 计算当前数字的位数 while [ $cl_no -gt 0 ] do cl_no=$(( cl_no / 10 )) len=$(( len + 1 )) done cln=$start sum=0 # 计算各位数字的len次方之和 while [ $cln -gt 0 ] do ldo=$(( cln % 10 )) cln=$(( cln / 10 )) mul=1 # 计算当前位的len次方 for (( j=1; j<=len; j++ )) do mul=$(( mul * ldo )) done sum=$(( sum + mul )) done if [ $sum -eq $start ] then echo $start fi done
运行结果
修复后执行脚本会输出1~1000范围内的所有阿姆斯特朗数:
1 2 3 4 5 6 7 8 9 153 370 371 407
内容的提问来源于stack exchange,提问作者simransharma3
相关产品推荐
相关产品推荐

