Bash脚本-一个难题

Bash脚本-一个难题,bash,shell,puzzle,Bash,Shell,Puzzle,脚本只接受一个参数,称之为n。然后,它交替地将数字的每一位从1到n进行加减 例如: n=12 1-2+3-4+5-6+7-8+9-1+0-1+1-1+2 产出:5 #!/bin/bash number=$1 result=1 if (( number == 1 || number == 0 )); then echo echo number: $number echo else for (( i = 1; i < number; i++ )); do

脚本只接受一个参数,称之为n。然后,它交替地将数字的每一位从1到n进行加减

例如:

n=12

1-2+3-4+5-6+7-8+9-1+0-1+1-1+2

产出:5

#!/bin/bash
number=$1
result=1
if (( number == 1 || number == 0 )); then
    echo
    echo number: $number
    echo
else
    for (( i = 1; i < number; i++ )); do
        if (( i < 10 )); then
            if (( i % 2 == 0 )); then
                let "result = result + i + 1"
            else
                let "result = result - i - 1"
            fi
        else
            for (( i = 10; i <= number; i++ )); do
                if (( i < 100 && i >= 10)); then
                    let "result = result - i/10 + i%10"
                else
                    let "result = result - i/100 + (i%100)/10 - (i/100)%10"
                fi
            done
        fi
    done

    echo
    echo result: $result
    echo number: $number
    echo
fi
它适用于整数0到9,但对于n>9,它给出了错误的答案

请更正我的脚本并向我解释为什么它会这样

PS我是bash脚本的新手,所以我想看看这个难题的另一个解决方案

PPS我对java很熟悉

编辑

我修复了代码,现在可以正常工作了

#!/bin/bash
number=$1
result=1
if (( number == 1 || number == 0 )); then
    echo
    echo number: $number
    echo
    else
    for (( i = 1; i < number; i++ )); do
        if (( i < 9 )); then
            if (( i % 2 == 0 )); then
                let "result = result + i + 1"
            else
                let "result = result - i - 1"
            fi
        fi
    done
    for (( i = 10; i <= number; i++ )); do
        if (( i < 100 )); then
            let "result = result - i/10 + i%10"
        else
            if (( i % 2 == 0 )); then
                let "result = result - i/100 + (i%100)/10 - (i%100)%10"
            else
                let "result = result + i/100 - (i%100)/10 + (i%100)%10"
            fi
        fi
    done

    echo
    echo result: $result
    echo number: $number
    echo
fi

在误读了问题或问题不清楚后,答案只做了一些小的调整。sting解决方案可能是使用模来获得+/-的最简单方法:


好的,这应该行的对不起,我错过了前面的问题

number=$1
MATSTR="";
for((i=1; i <= number; i++)); do
        MATSTR="$MATSTR$i";
done;
echo $MATSTR | sed -e 's/\(.\)\(.\)/\1-\2+/g' | sed 's/+$//' | bc 
说明:

For循环创建字符串,将从1到数字的所有数字连接在一起。 sed语句将每两位数替换为第一位数减去第二位数加上 sed删除任何尾随加号 bc计算语句
这是您的原始解决方案,但在注释中有错误修复。当然,对于大于99的数字,它仍然不起作用

#!/bin/bash
number=$1
result=0                                            # Don't start at 1!!
if (( number == 1 || number == 0 )); then
    echo
    echo number: $number
    echo
else
    for (( i = 1; i <= number; i++ )); do           # <=, not <
        if (( i < 10 )); then                       # < 10, not < 9
            if (( i % 2 == 0 )); then
                let "result = result - i"           # subtraction! Also, the +1 was unnecessary
            else
                let "result = result + i"           # addition!
            fi
        else
            if (( i < 100 && i >= 10)); then
                let result=result-i/10+i%10
            else
                let "result=result-i/100+(i%100)/10-(i/100)%10"
            fi
        fi
    done

    echo
    echo result: $result
    echo number: $number
    echo
fi 

这是你想要的吗?你希望这里有什么运算符优先级?result=result-i-1你应该使用i@KyleStrand是的,对于int>=9是真的,我会编辑代码什么?不,现在你有了一个嵌套的for循环,完全没有理由。我指的是第一行。结束条件是错误的。如果一个问题没有被隔离到你知道bash在做你不期望的事情的地步,那么它还没有准备好提问。你需要做的就是找出发生这种情况的地方/方式/原因。从10开始,它应该把数字分成1和0,11=1和1等等。它仍然不能正常工作,对于n=99,输出应该是-40而不是50。我想我现在知道了。是的,99=>-40。好的拼图!然而,我相信它从10点开始给出了错误的答案。如果10应该是+0使11=1,答案应该是5,因为i=10而不是4?谢谢,10应该是1-2+3-4+5-6+7-8+9-1+0,这等于4现在我明白了!使用10中的两个数字,而不仅仅是使10=0。你搞定了-唯一的方法是连接所有的数字,然后沿着字符串进行加法和减法运算。很好地完成了bc.@DavidC.Rankin我已经在第一篇文章中修复了我的代码,现在可以工作了。因此,这不是唯一的方法:p bc解决方案在大量使用时比循环解决方案更有效。取1100 ans=310。循环时间=>2.1秒,bc时间=>0.19秒sec@Fizunik我已经解释了您的代码是如何或多或少地意外工作的。我还修复了它,使它以合理、可读性强、语义正确的方式工作。为什么你认为它不起作用而不去尝试呢?是的,对不起。。我复制粘贴了它,但在测试时没有保存它。我的错。我明白你的意思。
number=$1
MATSTR="";
for((i=1; i <= number; i++)); do
        MATSTR="$MATSTR$i";
done;
echo $MATSTR | sed -e 's/\(.\)\(.\)/\1-\2+/g' | sed 's/+$//' | bc 
#!/bin/bash
number=$1
result=0                                            # Don't start at 1!!
if (( number == 1 || number == 0 )); then
    echo
    echo number: $number
    echo
else
    for (( i = 1; i <= number; i++ )); do           # <=, not <
        if (( i < 10 )); then                       # < 10, not < 9
            if (( i % 2 == 0 )); then
                let "result = result - i"           # subtraction! Also, the +1 was unnecessary
            else
                let "result = result + i"           # addition!
            fi
        else
            if (( i < 100 && i >= 10)); then
                let result=result-i/10+i%10
            else
                let "result=result-i/100+(i%100)/10-(i/100)%10"
            fi
        fi
    done

    echo
    echo result: $result
    echo number: $number
    echo
fi