我有一个练习,我需要把每个数字加起来,直到一个给定的数字,像这样:
假设我有数字12,我需要做1+2+3+4+5+6+7+8+9+1+0+1+1+1+2
(9之后的数字被分成单独的数字)。11 = 1+ 1,234 = 2+3+4等)
我知道我可以用:
seq -s '' 12
输出123456789101112,然后将它们加在一起,中间加上'+',然后管道到'bc',但我必须特别做:
echo 12 | ...
作为第一步(因为在线IDE将其填充为每个测试用例的不可更改的第一步),当我这样做时,我开始遇到seq
的问题我试着
echo 12 | seq -s '' $1
### or just ###
echo 12 | seq -s ''
但不能让它工作,因为这只是返回一个丢失的操作数错误为seq(因为我在终端,而不是一个脚本和'12'不只是分配给$1我假设),任何建议如何避免它或如何让seq从echo解释12作为操作数或替代方法去?
seq -s '' $(cat)
完整解决方案:
echo "12" | seq -s '' $(cat) | sed 's/./&+/g; s/$/0/' | bc
或
echo 12 | { echo $(( $({ seq -s '' $(< /dev/stdin); echo; } | sed -E 's/([[:digit:]])/1+/g; s/$/0/') )); }
withoutsed
:
d=$(echo 12 | { seq -s '' $(< /dev/stdin); echo; }); echo $(( "${d//?/&+}0" ))
echo 12 | awk '{
cnt=0
for(i=1;i<=$1;i++) {
cnt+=i
printf("%s%s",i,i<$1?"+":"=")
}
print cnt
}'
打印:
1+2+3+4+5+6+7+8+9+10+11+12=78
如果只是数字相加:
echo 12 | awk '{s=""
for(i=1;i<=$1;i++) s=s i
split(s,ch,"")
for(i=1;i<=length(ch); i++) cnt+=ch[i]
print cnt
}'
51
或POSIX管道:
$ echo 12 | seq -s '' "$(cat)" | sed -E 's/([0-9])/1+/g; s/$/0/' | bc
51