shell练习--PAT试题1010:一元多项式求导 (25 分)(失败案例喜加一)

---恢复内容开始---

1010 一元多项式求导 (25 分)

设计函数求一元多项式的导数。(注:xn​​(n为整数)的一阶导数为nxn1​​。)

输入格式:

以指数递降方式输入多项式非零项系数和指数(绝对值均为不超过 1000 的整数)。数字间以空格分隔。

输出格式:

以与输入相同的格式输出导数多项式非零项的系数和指数。数字间以空格分隔,但结尾不能有多余空格。注意“零多项式”的指数和系数都是 0,但是表示为 0 0

输入样例:

3 4 -5 2 6 1 -2 0

输出样例:

12 3 -10 1 6 0

说来惭愧,我都忘记了导数是个什么鬼了,所以参考其他人的答案,用shell方式仿写,过不过另说了
在此致谢:https://zhuanlan.zhihu.com/p/47142303 的作者君

分析题目:
1.以指数递降方式输入多项式非零项系数和指数(绝对值均为不超过 1000 的整数)。
  非零项系数,也就是说存在一个未知数x,x的系数非0,对应 3 4 及表示对多项式为:3 * x **4 。求导之后返回的结果为: 3 * 4 * x**(4-1) 对应返回系数为 12 返回指数为3.
2.注意“零多项式”的指数和系数都是 0,但是表示为 0 0
  这里表示的是,当x的系数为0,或者x的指数为0的时候,表示为 0 0 (对常数求导,结果为0)
shell示例代码如下:
#!/bin/bash

func_fx(){ 
if [ $(expr $1 * $2 ) -eq 0 ]  #需要注意的是expr的格式,运算符前后需要空格,乘号需要转义
then
        echo " 0 0"   #shell函数的返回使用echo
else
        echo " $(expr $1 * $2) $(expr $2 - 1)"   #直接使用空格隔开
fi
}

read -p"input numbers:" numbers

item=($numbers)   #转换为数组

if [ ${item[1]} -eq 0 ]
then
        echo " 0 0"
else
        lex_fx=$(expr ${#item[@]} / 2)
        for (( i=0;i<$lex_fx;i++)) 
        do
                result=$(func_fx ${item[$(expr $i * 2)]} ${item[$(expr $i * 2 + 1)]} )
                result_items+=$result  #拼接字符串,注意的是 result返回的结果本身有空格分隔
        done
        result_items=($(echo $result_items))  #转化为数组,方便删除对应元素位的0
        if [ ${result_items[-1]} -eq 0 ] && [ ${result_items[-2]} -eq 0 ]
        then
                unset result_items[-1]
                unset result_items[-2]    
                echo ${result_items[@]}    #因为shell的数组默认就是以空格分隔,末尾无空格,所以直接输出          
                exit
        fi
fi

  结论,失败案例喜加一!

原文地址:https://www.cnblogs.com/wyf-349/p/11474557.html