2023年9月27日-秋招-第二题(200分)-计算式

在线评测链接

题目描述

给定两个多项式的系数,第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)=4x25x6

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的题目

大数加法:2. 两数相加 - 力扣(LeetCode)

大数乘法:43. 字符串相乘 - 力扣(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;
    }
}

  • 15
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

塔子哥学算法

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值