红联Linux门户
Linux帮助

一个bash小程序

发布时间:2012-10-06 11:56:40来源:红联作者:思雨
一个数如果恰好等于它的因数之和,则称为完数下面是一个查找1000以内完数的shell脚本:
#!/bin/bash
#设置变量i,查找1000内的完数
for ((i=1;i<1000;i++))
do
for ((m=0,a=1; a <= $i/2;++a))
do
#判断a是否为i的因数
v1=$[$i % $a]
if [ $v1 -eq 0 ]
then
#因数相加
m=`echo "$m+$a" | bc`
#若相加结果等于i,则显示i的值
if [ $m -eq $i ]
then
echo $i
fi
fi
done
done


运行得到的结果是:6、24、28、496。但24并不是完数,其他的都正确,不知道这个24是怎么来的,脚本的问题在哪里呢?
文章评论

共有 4 条评论

  1. 思雨 于 2012-10-09 17:06:21发表:

    嗯嗯,果然对了。太谢谢了,我会注意的

  2. 胶头滴管3 于 2012-10-07 19:37:39发表:

    24是因为你的判断条件放的位置不对,24的因数1+2+3+4+6+8=24,所以会输出24正确的写法是:
    for ((i=1;i<1000;i++))
    do
    for ((m=0,a=1; a <= $i/2;++a))
    do
    #判断a是否为i的因数
    v1=$[$i % $a]
    if [ $v1 -eq 0 ]
    then
    #因数相加
    m=`echo "$m+$a" | bc`
    #若相加结果等于i,则显示i的值
    #在这里内循环结束
    fi
    done
    if [ $m -eq $i ]
    then
    echo $i
    fi
    done

    这样就好了,另外,希望楼主能注意书写格式,毕竟,好的书写方式是赏心悦目的

  3. 思雨 于 2012-10-07 09:14:25发表:

    这是c代码,能得到正确结果
    #include
    main()
    {
    int i,a,m;
    for(i=1;i<1000;i++)
    {
    for(m=0,a=1;a<=i/2;a++)
    if(i%a==0)
    m=m+a;
    if(m==i)
    printf("%4d",i);
    }
    }

  4. Htgiot 于 2012-10-06 21:36:37发表:

    不懂,帮不上忙