在线评测链接
题目描述
给定两个多项式的系数,第i项表示指数为n-i的系数。输出两个多项式的求和结果。
输入描述
第一行表示一个多项式的系数,第二行表示另一行多项式的系数,第三行表示多项式运算符
运算符只包含+、-、*。数组长度小于等于128,数组范围为 [ − 512 , 512 ] [-512, 512] [−512,512]
输出描述
输出运算后的系数数组,需要去除前缀零。
样例
输入
[1 2 3 4 5 6]
[-4 -5 -6]
+
输出
[1 2 3 0 0 0]
说明
多项式系数数组 [ 1 [1 [1 2 2 2 3 3 3 4 4 4 5 5 5 6 ] 6] 6]
表示多项式 A ( x ) = x 5 + 2 x 4 + 3 x 3 + 4 x 2 + 5 x + 6 A(x)=x^5+2x^4+3x^3+4x^2+5x+6 A(x)=x5+2x4+3x3+4x2+5x+6
多项式系数数组 [ − 4 [-4 [−4 − 5 -5 −5 − 6 ] -6] −6]
表示多项式 B ( X ) = − 4 x 2 − 5 x − 6 B(X)=-4x^2-5x-6 B(X)=−4x2−5x−6
A ( x ) + B ( X ) = x 5 + 2 x 4 + 3 x 3 A(x)+B(X)=x^5 +2x^4 + 3x^3 A(x)+B(X)=x5+2x4+3x3,对应的多项式系数数组为 [ 1 [1 [1 2 2 2 3 3 3 0 0 0 0 0 0 0 ] 0] 0]
思路:大数加法/乘法模拟
不熟悉大数加法/乘法的同学可以先学习一下这两道Leetcode的题目
这道题就可以用上面两道题的求解思路来求解,我们可以把减法看成特殊的加法,因此,我们可以写两个函数,分别表示加法和乘法,然后根据题目要求模拟即可
时间复杂度
乘法是 O ( n 2 ) O(n^2) O(n2),加法/减法是 O ( n ) O(n) O(n)
代码
C++
#include<bits/stdc++.h>
using namespace std;
vector<int> add(vector<int>& a, vector<int>& b) {
int n = max(a.size(), b.size());
vector<int> res(n);
for(int i = 0; i < n; i++) {
if(i < a.size()) res[i] += a[i];
if(i < b.size()) res[i] += b[i];
}
reverse(res.begin(),res.end());
while(res.size() > 1 && res[0] == 0) {
res.erase(res.begin());
}
return res;
}
vector<int> subtract(vector<int>& a, vector<int>& b) {
int n = max(a.size(), b.size());
vector<int> res(n);
for(int i = 0; i < n; i++) {
if(i < a.size()) res[i] += a[i];
if(i < b.size()) res[i] -= b[i];
}
reverse(res.begin(),res.end());
while(res.size() > 1 && res[0] == 0) {
res.erase(res.begin());
}
return res;
}
vector<int> multiply(vector<int>& a, vector<int>& b) {
int n = a.size() + b.size() - 1;
vector<int> res(n);
for(int i = 0; i < a.size(); i++) {
for(int j = 0; j < b.size(); j++) {
res[i+j] += a[i] * b[j];
}
}
reverse(res.begin(),res.end());
while(res.size() > 1 && res[0] == 0) {
res.erase(res.begin());
}
return res;
}
int main() {
string s;
getline(cin, s);
stringstream ss(s.substr(1, s.length()-2));
vector<int> a;
int x;
while(ss >> x) a.push_back(x);
reverse(a.begin(),a.end());
getline(cin, s);
ss.clear();
ss.str(s.substr(1, s.length()-2));
vector<int> b;
while(ss >> x) b.push_back(x);
reverse(b.begin(),b.end());
char op;
cin >> op;
vector<int> res;
if(op == '+') res = add(a, b);
else if(op == '-') res = subtract(a, b);
else if(op == '*') res = multiply(a, b);
cout << "[";
for(int i = 0; i < res.size(); i++) {
if(i != 0) cout << " ";
cout << res[i];
}
cout << "]" << endl;
return 0;
}
python代码
def readIn ():
x = list(map(int , input()[1:-1].split(' ')))
y = list(map(int , input()[1:-1].split(' ')))
return x , y
def solve(x):
return x[::-1]
def mul (a , b , n , m):
ans = [0] * (n + m - 1)
for i in range(n):
for j in range(m):
ans[i + j] += a[i] * b[j]
return ans
a , b = readIn()
n = len(a)
m = len(b)
a = solve(a)
b = solve(b)
c = input()
ans = []
if c == '-':
for i in range(max(n , m)):
s = 0
if i < n:
s += a[i]
if i < m:
s -= b[i]
ans.append(s)
if c == '*':
ans = mul(a , b , n , m)
if c == '+':
for i in range(max(n , m)):
s = 0
if i < n:
s += a[i]
if i < m:
s += b[i]
ans.append(s)
def get(x):
while len(x) > 1 and x[-1] == 0:
x.pop()
return x
ans = solve(get(ans))
output = "[" + " ".join(map(str , ans)) + "]"
print (output)
Java代码
import java.util.*;
class Main{
public static void main(String[] args){
Scanner in = new Scanner(System.in);
String s1=in.nextLine();
String s2=in.nextLine();
int[] data1=sol1(s1);
int[] data2=sol1(s2);
int max=Math.max(data1.length,data2.length);
int multi_max=data1.length+data2.length-2;
if(data1.length!=max) data1=sol2(data1,max);
if(data2.length!=max) data2=sol2(data2,max);
String p=in.nextLine();
int[] res=null;
if(p.equals("+")) res=plus(data1,data2);
else if(p.equals("-")) res=subs(data1,data2);
else res=multi(data1,data2,multi_max);
System.out.print("[");
for(int i=0;i<res.length;i++){
if(i!=res.length-1) System.out.print(res[i]+" ");
else System.out.print(res[i]);
}
System.out.print("]");
}
public static int[] reverse(int[] data){
for(int i=0;i<data.length/2;i++){
int t=data[i];
data[i]=data[data.length-i-1];
data[data.length-i-1]=t;
}
return data;
}
public static int[] plus(int[] data1,int[] data2){
int[] res=new int[data1.length];
for(int i=0;i<data1.length;i++){
res[i]=data1[i]+data2[i];
}
return res;
}
public static int[] subs(int[] data1, int[] data2){
int[] res=new int[data1.length];
for(int i=0;i<data1.length;i++){
res[i]=data1[i]-data2[i];
}
return res;
}
public static int[] multi(int[] data1,int[] data2,int len){
int[] res=new int[len+1];
data1=reverse(data1);
data2=reverse(data2);
for(int i=0;i<res.length;i++){
for(int j=0;j<=i ;j++){
if(j<data1.length && i-j<data2.length)
res[i]+=(data1[j]*data2[i-j]);
}
}
res=reverse(res);
return res;
}
public static int[] sol2(int[] data,int max){
int n=data.length;
int[] res=new int[max];
int t=n-1;
int i=max-1;
while(t>=0){
res[i]=data[t];
i--;t--;
}
return res;
}
public static int[] sol1(String s){
s=s.substring(1,s.length()-1);
String[] t=s.split(" ");
int[] res=new int[t.length];
for(int i=0;i<t.length;i++){
res[i]=Integer.parseInt(t[i]);
}
return res;
}
}