一元多项式的乘法与加法运算(数据结构)

先贴题目:

设计函数分别求两个一元多项式的乘积与和。

输入格式:

输入分2行,每行分别先给出多项式非零项的个数,再以指数递降方式输入一个多项式非零项系数和指数(绝对值均为不超过1000的整数)。数字间以空格分隔。

输出格式:

输出分2行,分别以指数递降方式输出乘积多项式以及和多项式非零项的系数和指数。数字间以空格分隔,但结尾不能有多余空格。零多项式应输出0 0

输入样例:

4 3 4 -5 2  6 1  -2 0
3 5 20  -7 4  3 1

输出样例:

15 24 -25 22 30 21 -10 20 -21 8 35 6 -33 5 14 4 -15 3 18 2 -6 1
5 20 -4 4 -5 2 9 1 -2 0

这是一道经典的多项式相加和相乘的问题,核心思想是用数组下标来表示指数,用下标对应的数据表示底数,c语言的写法在此不赘述。

由于老师不对编程语言做要求,所以这道题我选择使用python3用另一种类似思路做的。

考虑一些极端情况,如一个多项式只有1次和1000次项,而如果此时仍用数组表示则浪费了很多空间。在python或者其他更加高级的编程语言中,我们不妨试试使用字典来表示多项式。

由于多项式是以x的指数来分开表示的,所以设置字典的键是指数,值是底数。在相加或相乘操作时对字典以键遍历,最后将字典导出为键-值对的列表并用lambda表达式以指数排序:

l1 = list(map(int, input().split()))
l2 = list(map(int, input().split()))
len1 = l1.pop(0)
len2 = l2.pop(0)
d1, d2 = dict(), dict()
for i in range(0, len1 * 2, 2):
    d1.setdefault(l1[i + 1], l1[i])
for i in range(0, len2 * 2, 2):
    d2.setdefault(l2[i + 1], l2[i])

ans = dict()
for i in d1.keys():
    for j in d2.keys():
        if i + j not in ans.keys():
            ans.setdefault(i + j, d1[i] * d2[j])
        else:
            ans[i + j] += d1[i] * d2[j]
s = sorted(ans.items(), key=lambda e: e[0], reverse=True)
b=False
if len(s)==0:
    print('0 0', end='')
else:
    for i in s:
        if b:
            if not i[1] == 0:
                print('', i[1], i[0], end='')
        else:
            if i[1] == 0:
                print('0 0', end='')
            else:
                print(i[1], i[0], end='')
            b = True

print('')
ans = d2.copy()
for i in d1.keys():
    if i not in d2.keys():
        ans.setdefault(i, d1[i])
    else:
        ans[i] += d1[i]
s = sorted(ans.items(), key=lambda e: e[0], reverse=True)

b=False
if len(s)==0:
    print('0 0', end='')
else:
    for i in s:
        if b:
            if not i[1] == 0:
                print('', i[1], i[0], end='')
        else:
            if i[1] == 0:
                print('0 0', end='')
            else:
                print(i[1], i[0], end='')
            b = True

发表评论

您的电子邮箱地址不会被公开。