首页 > 解决方案 > 在 shell 脚本中查找给定数字的友好数字

问题描述

我正在尝试编写一个 shell 脚本,该脚本将为用户输入的给定数字找到友好的数字。如果找到它将打印友好的 no 否则将打印“否”。我得到了预期的输出,但这需要一些时间。如果代码经过优化,这将非常有帮助。我在 git bash 上运行代码。

declare -A input
echo "enter the no of inputs"
read n
echo "enter the numbers"
for((i=0;i<n;i++))
do
    read n1
    input[$i]=$n1
done
findDivisors() {
    sum=1
    sqrtNo=$(echo "$1" | awk '{printf "%.0f\n",sqrt($1)}')
    for((i=2;i<=$sqrtNo;i++))
    do
        if [ `expr $1 % $i` -eq 0 ]; then
            if [ $i -eq `expr $1 % $i` ]; then
                let sum+=$i
            else
                let sum+=$i+"($1/$i)"
            fi
        fi
    done
    echo "$sum"
}
findAmicableNo() {
    ret=$(findDivisors $1)
    s2=$(findDivisors $ret)
    if [ $s2 -eq $1 ]; then
        echo "Yes, amicable with $ret"
    else
        echo "No"
    fi
}
for i in "${!input[@]}"
do
    findAmicableNo ${input[$i]}
done

标签: shell

解决方案


既然你已经awk在你的脚本中使用了,你不妨完全为awk. 这要快得多。

#!/usr/bin/awk -f
BEGIN { print "enter the no of inputs"
        getline n
        print "enter the numbers"
        i = 0
      }
      {
        input[i++] = $0
        if (n <= i) nextfile
      }
END   {
        for (i in input) findAmicableNo(input[i])
      }
function findAmicableNo(n)
{
    ret = findDivisors(n)
    s2 = findDivisors(ret)
    if (s2 == n)
        print "Yes, amicable with "ret
    else
        print "No"
}
function findDivisors(n)
{
    sum = 1
    sqrtNo = sqrt(n)
    for (i = 2; i <= sqrtNo; i++)
        if (n % i == 0 )
            if (i == n % i)
                sum += i
            else
                sum += i+n/i
    return sum
}

推荐阅读