一、题目
设计函数求一元多项式的导数。(注:x^n(n为整数)的一阶导数为nx ^n−1 。)
二、输入输出
输入格式:
以指数递降方式输入多项式非零项系数和指数(绝对值均为不超过 1000 的整数)。数字间以空格分隔。
输出格式:
以与输入相同的格式输出导数多项式非零项的系数和指数。数字间以空格分隔,但结尾不能有多余空格。注意“零多项式”的指数和系数都是 0,但是表示为 0 0。
三、样例
输入样例:
3 4 -5 2 6 1 -2 0
结尾无空行
输出样例:
12 3 -10 1 6 0
结尾无空行
四、题目分析
这道题目原理很简单,但要写出最高效率的代码需要深入思考。
其次这里面有个大坑,是仅仅使用Python语言才会遇到的。
1.思路:只需要借助flag标记保证结尾无空行的同时还能过滤输出,无需中间数组存储,直接输出,空间占用少,时间效率高。(详见代码1)。
2.大坑提醒:Python 中的split()函数用法回顾:
描述
split() 通过指定分隔符对字符串进行切片,如果第二个参数 num 有指定值,则分割为 num+1 个子字符串。
语法
split() 方法语法:
str.split(str="", num=string.count(str))
参数
str – 分隔符,默认为所有的空字符,包括空格、换行(\n)、制表符(\t)等。
num – 分割次数。默认为 -1, 即分隔所有。
返回值
返回分割后的字符串列表。
wa原因:由于Python并不具有像C++那种可以借助循环来输入不确定个数的整数,因此只能一股脑读入然后依靠分隔符函数split()分隔并存储在列表中,问题在于split(’ ‘)和split()的区别是,前者只能对空格分割,后者对包括空格、换行(\n)、制表符(\t)等进行分割。
然而题目中坑人的一点在于:
说好的以空格分隔,实际上如果使用split(’ ‘)再提交会显示两个测试点非零返回,如图:
非零返回意思就是说程序运行过程出错而异常退出,说明存在逻辑错误导致程序中断。
其实把split(’ ')里的引号去掉就能AC了。猜测可能是系统的测试点中有换行符,当数据量庞大时,存储在系统数据库的测试数据以文件形式存储,测试时也是连带换行符一起读去了的,因此需要用split()而非split(’ ')。
这也给我们提了个醒,千万不要以为PTA是个OJ系统就一定得对做题的人负责,我们作为程序设计人员也要思考PTA测试的本质,包括数据量、数据格式、题目出发点等等角度,这样综合起来考虑才更能跳出桎梏,走得更远。
五、Python代码
1.代码1(改编自柳婼,简洁巧妙):
get = input()
get = [int(i) for i in get.split()]
flag = 0
for i in range(0, len(get), 2):
a = get[i]
b = get[i + 1]
if (b!=0):
if (flag == 1):
print(' ', end='')
print(str(a * b)+' ' + str(b -1), end='')
flag = 1
if (flag == 0):
print('0 0', end='')
2.代码2(典型Python解题思路):
s = input().strip('\n').split()
print(s)
res = []
for i in range(0,len(s),2):
if(int(s[i + 1]) == 0):
continue
m = int(s[i]) * int(s[i + 1])
n = (int(s[i + 1])) - 1
res.append(str(m))
res.append(str(n))
if(len(res) == 0):
print('0 0')
else:
print(' '.join(res).strip())