`

多项式乘法

阅读更多
题目的链接为:http://acm.njupt.edu.cn/acmhome/problemdetail.do?&method=showdetail&id=1006
题目为:
多项式乘法
时间限制(普通/Java):1000MS/3000MS          运行内存限制:65536KByte
总提交:171            测试通过:77

描述


线性表是一种最简单、最基本,也是最常用的数据结构,其用途十分广泛,例如,用带表头结点的单链表求解一元整系数多项式加法和乘法运算。

现给两个一元整系数多项式,请求解两者的乘积。


输入


两组数据,每一组代表一个一元整系数多项式,有多行组成,其中每一行给出多项式每一项的系数和指数,这些行按指数递减次序排序。每一组结束行输入为0 -1


输出


三组数据,前两组为一元整系数多项式,最后一组为两个多项式的乘积。

一元整系数多项式输出形式如下:

(1)多项式项4x输出为4X

(2)多项式项4x2输出为4X^2

(3)第一项系数为正数时,加号不要输出

(4)除常系数项外,项系数为1不显式输出,-1输出为-

例如,4x3- x2+x-1正确输出形式为4X^3-X^2+X-1,错误输出形式为 +4X^3-1X^2+1X-1


样例输入

3 14
-8 8
6 2
2 0
0 -1
2 10
4 8
-6 2
0 -1

样例输出

3X^14-8X^8+6X^2+2
2X^10+4X^8-6X^2
6X^24+12X^22-16X^18-50X^16+12X^12+76X^10+8X^8-36X^4-12X^2

刚做完多项式加法,趁热打铁做多项式乘法。其实乘法就是遍历两个多项式,将系数相乘,指数相加:
如果有指数相同的项,那么合并;
如果没有指数相同的项,那么按照指数递减的顺序找到合适的位置存放该项目。
最后再输出。
#include<iostream>
using namespace std;
typedef struct node{
      
      int xs;
      int zs;
      struct node *next;  
}Node;
int xs,zs;
bool tag=true;
void print(Node *root)
{
    Node *p=root->next;
    while(p!=NULL)
    {
         if(p->xs==0)
         {
             p=p->next;
             continue; 
         }
         if(p==root->next)
         {
              if(p->xs!=1)
              {
                 if(p->xs==-1)
                 {
                     cout<<"-"; 
                 }    
                 else
                 {
                     cout<<p->xs; 
                 }
              } 
         } 
         else
         {
              if(p->xs>0)
              {
                   cout<<"+";
                   if(p->xs!=1)
                   {
                       cout<<p->xs; 
                   }
              } 
              else
              {
                    if(p->xs!=-1)
                    {
                       cout<<p->xs;
                    } 
                    else
                    {
                       cout<<"-"; 
                    }
              }
         }
         if(p->zs!=0)
         {
               cout<<"X";
         }
         else
         {
               if(p->xs==1||p->xs==-1)
               {
                  cout<<"1"; 
               }
               
               p=p->next;
               continue; 
         }
         if(p->zs!=1)
         {
               cout<<"^"<<p->zs; 
         }
         
         p=p->next;
    }
    cout<<endl;
}
int main(){

    Node *root[2],*root1,*t,*u,*k,*e1,*e2;
    for(int i=0;i<2;i++){
        root[i]=NULL; 
    } 
    root1=new Node();
    for(int i=0;i<2;i++){
        while(cin>>xs>>zs&&(xs!=0||zs!=-1)){
         
            if(xs==0)
            {
               continue;
            }
            if(root[i]==NULL)
            {
                  Node *temp=new Node();
                  temp->xs=xs;
                  temp->zs=zs;
                  temp->next=NULL;
                  
                  root[i]=new Node();
                  root[i]->next=temp;
            }
            else
            {
                  Node *p,*q;
                  p=root[i]->next;
                  q=root[i];
                  while(p!=NULL&&p->zs!=zs)
                  {
                       q=p;
                       p=p->next; 
                  }
                  if(p==NULL)
                  {
                       Node *temp=new Node();
                       temp->xs=xs;
                       temp->zs=zs;
                       temp->next=NULL;
                  
                       q->next=temp;
                  }
                  else
                  {
                       p->xs+=xs;
                       if(p->xs==0)
                       {
                           q->next=p->next; 
                       }
                  }
            }
        }
        print(root[i]);  
    }
    t=root[0]->next;
    u=root[1]->next;
    k=root1;
   
    while(t!=NULL)
    {
       u=root[1]->next;
       while(u!=NULL)
       {
           int tempXS=t->xs*u->xs;
           int tempZS=t->zs+u->zs;
           if(tempXS==0)
           {
               u=u->next;
               continue;
           }
           else
           {
               e2=root1->next;
               e1=root1;
               while(e2!=NULL&&e2->zs!=tempZS)
               {
                     e1=e2;
                     e2=e2->next;
               }
               if(e2==NULL)
               {
                     Node *tempNode=new Node();
                     tempNode->xs=tempXS;
                     tempNode->zs=tempZS;
                     tempNode->next=NULL;
                     
                     //按照指数的大小放到合适的位置
                     e2=root1->next;
                     e1=root1;
                     while(e2!=NULL&&e2->zs>tempNode->zs)
                     {
                          e1=e2;
                          e2=e2->next; 
                     }
                     e1->next=tempNode;
                     tempNode->next=e2;
               }
               else
               {
                     e2->xs+=tempXS;
               }
           }
           u=u->next;
       }  
       t=t->next; 
    }
    print(root1);
    
    //释放new的空间 
    for(int i=0;i<2;i++)
    {
        t=root[i];
        u=t;
        while(t!=NULL)
        {
              u=t->next;
              delete t;
              t=u;
        } 
    }
    t=root1;
    u=t;
    while(t!=NULL)
    {
              u=t->next;
              delete t;
              t=u;
    } 
    system("pause");
    return 0;
}
分享到:
评论

相关推荐

    简单的多项式乘法实现程序 C语言

    在计算机科学中,多项式乘法是数学运算的一部分,它在算法设计、数值计算和图形处理等领域有着广泛应用。本文将详细讲解如何使用C语言来实现简单的多项式乘法。 首先,我们需要理解多项式的基本概念。一个多项式是...

    多项式乘法(java源代码)

    在计算机科学领域,尤其是数值计算和算法设计中,多项式乘法是一项基本操作。这个Java源代码实现的目的是为了高效地处理两个多项式之间的乘法运算。多项式通常表示为一系列系数与变量的乘积之和,例如 \(P(x) = a_nx...

    C++ 单链表实现多项式乘法

    ### C++ 单链表实现多项式乘法 #### 实习任务及需求分析 本次实习的任务是使用C++编程语言,通过单链表的数据结构来实现两个多项式的相乘操作。这一过程涉及到对多项式的理解、单链表的运用以及算法的设计与优化。...

    数据结构课设(一元多项式乘法)

    (2)设计算法实现一元多项式乘法; (3)分析算法的时间复杂度和空间复杂度 一、总体设计 1 二、详细设计 1 2.1存储结构 1 2.2建立链表 1 2.3遍历操作 1 2.4多项式相乘算法 2 三、调试与测试 2 3.1方案一 2 3.2...

    一元多项式乘法,功能: 完成两个n元多项式作乘法,给出明确的等式形式。

    标题中的“一元多项式乘法”是指在数学中,两个一元多项式相乘得到新的多项式的过程。这个过程通常涉及到将一个多项式的每个项与另一个多项式的每个项相乘,然后将结果合并,去除相同的项并进行加法运算。在计算机...

    算法 n元多项式乘法

    题目:n元多项式乘法 功能: 完成两个n元多项式作乘法,给出明确的等式形式。 分步实施: 1. 初步完成总体设计,搭好框架,确定人机对话的界面,确定函数个数; 2. 完成最低要求:建立一个文件,实现两个一元二次...

    重模多项式乘法在FPGA上的实现.pdf

    标题:“重模多项式乘法在FPGA上的实现” 知识点: 1. FPGA:FPGA是Field-Programmable Gate Array的缩写,即现场可编程门阵列。它是一种可以通过用户编程来配置的数字集成电路。FPGA内部由可编程逻辑块、可编程...

    多项式乘法快速算法FFT

    【快速傅里叶变换FFT(Fast Fourier Transform)】是一种用于计算多项式乘法的高效算法,它的核心思想是将复杂的直接乘法运算转化为在复数域内的加法运算,大大降低了计算复杂度。传统的多项式乘法算法,如展开相乘...

    FFT 多项式乘法 C代码

    在这个主题中,我们将深入探讨如何使用C语言实现FFT来优化多项式乘法的算法。 首先,我们要理解多项式乘法的传统方法,如卡尔丹诺公式或链接表法,这些方法的时间复杂度通常是O(n^2),其中n是多项式的度。而FFT可以...

    算法文档无代码多项式乘法算法文档无代码多项式乘法

    根据所提供的文件信息,我们可以挖掘出的知识点主要集中在“算法文档无代码多项式乘法”的主题上。由于文件内容提供的信息比较有限,我们将结合相关知识点进行扩展,以便提供一个详尽的介绍。 多项式乘法是计算机...

    多项式乘法代码

    在计算机科学领域,特别是在算法竞赛(ACM,国际大学生程序设计竞赛)中,多项式乘法是一个常见的问题。这个问题涉及到数据结构和算法的设计,通常要求高效地计算两个一元整系数多项式的乘积。本题目的目标是实现一...

    一元多项式乘法

    在计算机科学和数学中,一元多项式乘法是一个基础且重要的操作,特别是在数值计算、符号计算以及算法设计中有着广泛的应用。本文将详细探讨如何实现两个一元多项式的乘法,重点在于采用二维数组来存储多项式的系数和...

    c语言实现多项式乘法

    在《数据结构》这本经典教材中,一个常见的实践课题是用编程语言来实现数学中的算法,例如多项式乘法。这个实验题目的目标是使用C语言来实现这一过程,这对于理解数据结构的应用和C语言的编程技巧都是很好的锻炼。 ...

    数据结构多项式乘法.pdf

    数据结构多项式乘法.pdf 本文档主要讨论了数据结构多项式乘法的算法设计和实现,具体来说是使用两个单链表来存储两个多项式,并实现多项式乘法运算。下面是对标题、描述、标签和部分内容的详细解释。 标题:数据...

    多项式乘法(C语言)

    【多项式乘法(C语言)】是C语言编程中的一种常见问题,涉及到对代数多项式的处理。在这个课程设计中,目标是让学生深入理解C语言的基础知识,包括语法、编程技巧,以及指针、结构体和链表的使用。这为后续学习数据...

    多项式乘法&魔王语言

    对已排序且合并了同指数项的两个多项式实现乘法操作,并输出结果; 结果多项式要求以动态链表为存储结构,复用原多项式的结点空间; 输出结果多项式要求按指数升序排列,同指数的多项要合并,项数的正负号要求显示...

    MUL.rar_多项式乘法

    在这个"多项式乘法"的实验中,我们聚焦于利用编程技术实现数学中的多项式乘法,并进行结果的排序。这个实验主要涉及以下几个关键知识点: 1. **多项式表示**:在计算机中,多项式通常用数组或链表等数据结构来表示...

    一元多项式乘法算法

    在IT领域,一元多项式乘法是一种基本的数学运算,尤其在计算机科学中的算法设计、数字信号处理、编码理论以及计算机图形学等方向有着广泛应用。这篇博客文章可能详细介绍了如何实现一元多项式的乘法算法。由于没有...

Global site tag (gtag.js) - Google Analytics