两个多项式相乘求解系数数组算法

题目描述:

  给出两个多项式,最高次幂分别为n和m,求解这两个系数相乘得到的系数数组。

分析:

  最高次幂如果是m和n,那么他们相乘得到的系数数组的最高次幂一定是n+m,对于其他的系数,不妨设a[],b[]是给定的两个系数数组,c[]是求解的答案数组,那么:

  c[i + j] += a[i] * b[j];

  这是数学公式的推导,可以求得。

代码:

#include<cstdio>
#include<iostream>
#include<cstring>
#include<string>
using namespace std;
const int N = 100;
int a[N];
int b[N];
int c[N*2];

void init(int n,int m){
    for(int i =0 ; i<n ; ++i){
        cin>>a[i];
    }
    for(int j = 0 ; j< m; ++j){
        cin>>b[j];
    }
}
void cal(int n,int m){
    for(int i = 0 ;i<= n; ++i){
        for(int j = 0 ;j <= m;++j){
            c[i+j] += a[i] * b[j];
        }
    }
}
void prt(int n,int m){
    for(int i =0 ;i <= n+m;++i){
        cout<<"c["<<n+m -i<<"] = "<<c[i]<<endl;
    }

}
int main(){
    int n,m;
    while(cin>>n>>m){
        init(n+1,m+1);
        cal(n,m);
        prt(n,m);
    }
return 0;
}
时间: 2024-08-19 19:14:48

两个多项式相乘求解系数数组算法的相关文章

两个多项式相乘和相加的算法

一个m项,一个n项 相加:从第一项开始,每一次都拿两个多项式的头开始比较,小的项就进目标链表,前进一格,从而完成相加,复杂度o(m+n) 相乘 : 算法1:o(m*m*n*n) 每一项相乘,结果插入目标链表里 算法2:o(m*n*n) 拿一个多项式每一项与另一整个多项式相乘,然后将这m个或n个多项式相加:这个算法比上个算法的优点在于利用了这两个多项式升序排的条件 算法3:待续

多项式相乘快速算法原理及相应C代码实现---用到fft

最近认真研究了一下算法导论里面的多项式乘法的快速计算问题,主要是用到了FFT,自己也实现了一下,总结如下. 1.多项式乘法 两个多项式相乘即为多项式乘法,例如:3*x^7+4*x^5+1*x^2+5与8*x^6+7*x^4+6*x^3+9两个式子相乘,会得到一个最高次数项为13的多项式.一般来说,普通的计算方法是:把A多项式中的每一项与B中多项式中的每一项相乘,得到n个多项式,再把每个多项式相加到一起,得到最终的结果,不妨假设A,B的最高次项都为n-1,长度都为n,那么计算最终的结果需要o(n^

链表实现多项式相乘-数据结构学习

链表实现多项式相乘<线性表> 初学数据结构,我这个菜鸟 没看教程完全自己想. 这个题做好了好久. 不过还好总于做出来了.  先上代码,代码里有注释. 可以把注释变为cout<<注释  看一下向乘的过程. 后面再做详细的补充说明 问题描述 : 输入两个多项式,多项式的第一个数是项数.后续是两两一对,一个系数,一个指数. 多项式有序,按照系数的降序. 通过单链表实现两个多项式相乘. 输出结果多项式.同样第一项为项的个数, 后续安装指数降序排列. 要通过链表实现. 解决思路: 初始时把两

PAT甲题题解-1009. Product of Polynomials (25)-多项式相乘

多项式相乘 注意相乘结果的多项式要开两倍的大小!!! #include <iostream> #include <cstdio> #include <algorithm> #include <cstring> #include <string.h> using namespace std; //两个多项式相乘 const int maxn=1000+5; int k; //原本定义个exp导致编译错误,没想到定义成exp1.exp2也会编译错误,

LeetCode167 两数之和 II - 输入有序数组

给定一个已按照升序排列 的有序数组,找到两个数使得它们相加之和等于目标数. 函数应该返回这两个下标值 index1 和 index2,其中 index1 必须小于 index2. 说明: 返回的下标值(index1 和 index2)不是从零开始的. 你可以假设每个输入只对应唯一的答案,而且你不可以重复使用相同的元素. 示例: 输入: numbers = [2, 7, 11, 15], target = 9 输出: [1,2] 解释: 2 与 7 之和等于目标数 9 .因此 index1 = 1

那些有关求解next数组的算法

next数组的历史 有关字符串的模式匹配算法中,比较容易写出的是朴素的匹配算法也就是一种暴力求解方式,但是由于其时间复杂度为子串长度和主串长度的乘积,例如strlen(subStr) = n,strlen(mainStr) = m,则其时间复杂度为O(mn). 为了能够得到更有效的匹配算法,D.E.Knuth与V.R.Pratt和J.H.Morris同时发现,因此人们称它为克努特--莫里斯--普拉特操作(简称KMP算法).KMP算法的关键是利用匹配失败后的信息,尽量减少模式串与主串的匹配次数以达

KMP算法---快速求解next数组

在KMP算法中,最关键的就是求解next数组了.那么如何快速求解next数组呢? 已知模式串:A B C D A B D D A 其next数组:0 0 0 0 1 2 0 0 1 那么是如何求证出来的呢? 首先字符串从左至右遍历. 第一个字符A的next数组对应元素为0, 第一个字符A和第2个字符B比,不相等.B:0(表示字符B的next数组对应元素为0): 第一个字符A和第3个字符C比,不相等.C:0 第一个字符A和第4个字符D比,不相等.D:0 第一个字符A和第5个字符A比,     相等

学习笔记:单链表实现多项式相乘(一)

单链表实现多项式相乘,有这样的一个思路可以参考: 实现多项式相乘,最关键的是系数和指数的两个数据,这里命名为coef和HighPower. 最简便的办法是使用两个嵌套循环例如(3x^2+4x^1)(x^2+2x^4)用3x^2遍历另外一个括号内的数据,同时实现本身括号内的遍历. 这个想法的核心程序可归纳为以下: while(pList!=NULL){ while(pList2!=NULL){ pNew=(PNODE)malloc(sizeof(NODE)); pNew->pNext=NULL;

算法研究:一维多项式求值(秦九韶算法)

问题通式: 求指定点X处的函数值. 思路: 运用秦九韶算法 将多项式表述成如下嵌套模式: 于是可以转换成程序语言思想: 可通过for循环来实现. 代码实现: C语言代码如下: #include <stdio.h> /* *函数名:double odpf(double array[], int n, double x) *参数:double array[] 系数数组 * int n 表示n项 * double x x的值 *返回值:计算结果sum *说明:One dimensional poly