shell - 在 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
解决方案
既然你已经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
}
推荐阅读
- python - 如何在不和谐中使用 exec() 发送消息
- javascript - 在 ScalaJS 中将 DOM 元素传递给第 3 方类构造函数失败
- php - 如何使更新端点更通用?(PHP)
- javascript - 锚链接在桌面上无法正常工作 - 在移动设备上工作正常
- java - 用户身份验证失败时的 Spring Security ProviderNotFoundException
- powershell - Powershell AD 语法 - 如果语句正在复制字符串
- php - 包含单引号和双引号的回显字符串以输入值
- textfield - Flutter Web - 文本字段滚动而不是选择长文本
- python - 如何从特定时间开始播放音频文件
- flutter - How can I wrap the height of the ListView.builder with a Container?