PTA 7-16 一元多项式求导
题目描述
设计函数求一元多项式的导数。
输入格式:
以指数递降方式输入多项式非零项系数和指数(绝对值均为不超过1000的整数)。数字间以空格分隔。
注意:零多项式用 0 0
表示。
输出格式:
以与输入相同的格式输出导数多项式非零项的系数和指数。数字间以空格分隔,但结尾不能有多余空格。
输入样例:
3 4 -5 2 6 1 -2 0
输出样例:
12 3 -10 1 6 0
题目分析
现在得解决这个问题,就是设计一个函数来求一元多项式的导数。题目输入是按指数递降的方式给出的,每个非零项的系数和指数,比如输入样例是3 4 -5 2 6 1 -2 0,对应的多项式应该是3x^4 -5x^2 +6x -2。导数的话,应该是各对应项的导数相加。那每一项的导数是系数乘以指数,然后指数减一。比如3x^4的导数是12x^3,-5x^2导数是-10x,6x导数是6,-2的导数是0。所以原输入对应的输出应该是12 3,-10 1,6 0。这些非零项的组合。那问题是如何处理输入,然后处理每一项,生成导数后的项,再输出。
那首先,我得把输入的字符串分割成系数和指数的对。比如输入样例被空格分割后,得到的是一个列表:['3','4','-5','2','6','1','-2','0']。然后每两个为一组,系数是第一个,指数是第二个。所以遍历的时候,步长是2,每次取两个元素。
然后,对每一对进行处理。如果指数是0的话,那么这一项的导数是0,所以应该被忽略。否则,导数后的项的系数是原系数乘以指数,指数减一。比如原项是系数c,指数e,那么导数项是c*e, e-1。这个时候,如果e是0的话,导数是0,所以这种情况下应该不处理。或者,如果原项的指数是0,那么不管系数是多少,导数后的系数都是0,所以这样的项在导数后就不应该出现在输出中。例如,原样例中的-2 0,导数后是0,所以不需要输出。
那么处理每一对的时候,需要先判断指数是否为0。如果指数是0,就跳过。否则,计算新的系数和指数。然后收集这些结果,作为导数后的项。
然后,输出的时候,需要按照指数递降的顺序排列吗?或者原输入是递降的,处理后的导数项的指数可能也是递降的吗?比如原样例的处理后的项是12 3(指数3),-10 1(指数1),6 0(指数0),所以输出的顺序是这三个项。这个时候指数是递减的。但是原输入可能不一定处理后的项的顺序是否递减?比如假设有一个输入项是系数2指数3,系数1指数5,那么原输入的顺序是1 5 2 3,导数后的项是5 4,6 2。这时候导数后的顺序应该是5 4,6 2,也就是指数还是递减的。因为原输入的指数是递降的,所以每项的指数是依次减小的。那导数后的项的指数是原指数减一,所以原输入的指数是递减的话,导数后的项的指数是否是递减的?例如原输入的指数是5、3,导数后的指数是4、2,所以顺序是对的。所以导数后的项的指数顺序应该还是递减的,所以处理后的项不需要重新排序,可以按照原来的顺序处理,只要去掉那些导数为0的项即可。
那这样的话,处理后的各项的顺序可以直接按照原顺序处理后的结果,而不用再排序?
是的。比如,原输入的指数是严格递减的,那么导数后的项的指数也会是严格递减的吗?例如原输入有两个项,比如指数是5和4。导数后的指数是4和3,顺序正确。如果有原输入的指数是5,然后3,那么导数后的指数是4,2,顺序也是正确的。所以只要原输入的指数是递降的,那么处理后的导数项的指数顺序也是正确的,不需要重新排序。所以处理后的结果可以直接按顺序输出。
那这样的话,处理步骤可以是:
1. 将输入字符串分割成列表,每两个为一对,系数和指数。
2. 遍历每一对,对每个项计算导数后的系数和指数。
3. 如果导数后的系数是0(比如原指数是0,或者原系数是0,但原题中输入的系数是非零的?原题输入是非零项的系数和指数。所以原输入中的项的系数都是非零的,所以原系数不会为0。所以导数后的系数是否为零只取决于原指数是否为0。例如原指数为0时,导数后的系数是原系数*0=0,所以必须被排除。而原指数非0的话,导数后的系数是原系数*指数,此时如果原系数和指数的乘积是否为0?原系数非零,指数非零的话,乘积也不为零。所以导数后的项的系数只有当原指数不为0的时候才会非零。所以处理的时候,对于每一对,如果原指数为0,则忽略;否则,计算新的系数和指数,并将结果保存。
4. 收集所有导数后的非零项,然后按照顺序输出。如果结果为空,说明原输入的所有项的指数都是0,或者原输入是零多项式。比如原输入是0 0的情况,这时导数后的结果也是0 0吗?
题目中有一个注意点:零多项式用0 0表示。比如原输入是零多项式的话,导数后的结果也是零多项式,所以输出应该是0 0。例如,如果原输入的系数和指数都是0,那么导数后的系数是0*0=0,指数是-1?或者原输入的0 0是否代表的是零多项式,即没有非零项的情况。此时,导数后的结果也是零多项式,所以输出0 0。
所以需要处理这种情况:
情况一:原输入是零多项式,即输入是0 0。此时导数后的结果也是零多项式,所以输出0 0。
其他情况下,原输入的各个项的指数必须非零吗?比如,输入的项可能包含指数为0的情况,比如输入样例中的-2 0。这个时候,在导数的时候,该项会被处理为-2*0=0,所以导数后的项会被忽略。
那处理过程应该是:
- 将输入分割成列表。
- 检查输入是否是零多项式的情况,即列表是['0', '0']。此时输出应为0 0。
- 否则,遍历每一对系数和指数,处理每一对:
- 系数c = int(list[i])
- 指数e = int(list[i+1])
- 如果e == 0:跳过,因为导数后的系数是0。
- 否则,计算新系数c * e,新指数e-1。如果新系数为0的话,比如当原系数乘以指数等于0?但原输入的系数和指数都是非零的,所以原系数非零,指数非零的话,乘积不可能为零。因此,新系数非零。所以这种情况下,新的项必须保留。
- 收集所有处理后的项,如果收集的结果为空,则说明原输入中的所有项的指数都是0,或者处理后的所有项的系数都为0?比如原输入是多个指数为0的项,如输入是3 0,那么导数后的系数是0,所以不保留。此时结果为空,这时候应该输出0 0吗?
比如,假设输入是3 0,那么原多项式是3,导数后的结果是0。所以此时导数后的多项式是零多项式,应该输出0 0。
因此,在代码中,处理完所有项后,需要判断收集的结果是否为空。如果为空的话,输出0 0。否则,按顺序输出各对系数和指数,用空格分隔,末尾不能有空格。
为了解决这个问题,我们需要设计一个函数来计算一元多项式的导数。输入的多项式以指数递降方式给出,我们需要以相同的格式输出导数多项式的结果。
方法思路
-
输入处理:首先读取输入并将其转换为整数列表。每个多项式项由系数和指数组成,按指数递降顺序排列。
-
零多项式处理:检查输入是否是零多项式(即输入为0 0),如果是,直接输出0 0。
-
导数计算:遍历每一对系数和指数,计算导数项。如果指数为0,则跳过该项(因为其导数为0)。否则,计算新系数和新指数,并保存结果。
-
结果处理:如果所有导数项的系数都为0,输出0 0。否则,按格式输出结果。
解决代码
# 读取输入并分割成列表
items = list(map(int, input().split()))
# 处理零多项式的情况
if len(items) == 2 and items[0] == 0 and items[1] == 0:
print("0 0")
else:
result = []
# 遍历每一对系数和指数
for i in range(0, len(items), 2):
coeff = items[i]
expon = items[i+1]
# 指数为0的项导数为0,跳过
if expon == 0:
continue
# 计算导数后的系数和指数
new_coeff = coeff * expon
new_expon = expon - 1
result.append(str(new_coeff))
result.append(str(new_expon))
# 处理结果为空的情况(所有项导数都是零)
if not result:
print("0 0")
else:
print(' '.join(result))
代码解释
-
输入处理:使用
input().split()
读取输入并分割成字符串列表,然后转换为整数列表。 -
零多项式检查:如果输入为0 0,直接输出0 0。
-
遍历处理每一对系数和指数:
-
使用步长2遍历列表,每次取两个元素(系数和指数)。
-
如果指数为0,跳过该项。
-
计算导数后的系数(原系数乘以指数)和指数(原指数减1),并保存到结果列表。
-