zoukankan      html  css  js  c++  java
  • 稀疏多项式的运算

    问题描述:

      已知稀疏多项式Pn(X)=c1x^e1+c2x^e2+....+cmx^em,其中n=em>em-1>....>e1>=0; ci!=0,m>=1.试采用存储量同多项式项数m成正比的顺序存储结构,编写求Pn(x0)的算法(x0为给定值),并分析你的算法的时间复杂度。

    问题分析:

    多项式的顺序存储结构为:

    Typedef struct {

    Int  coef;

    Int  exp;

    }PolyTerm;

    Typedef struct{

    PolyTerm  *data;

    Int  length;

    }SqPoly;//多看下,加深理解结构体

    什么叫做存储量同多项式项数m成正比的顺序存储结构?这意味着随着m的增大,存储量增加,好吧,这句话貌似没用。主要是求值了。看了代码后,挺容易理解的,自己还不知道这样做就行了。

     

    紧接着下一题是编写求P(x)=Pn1(x)-Pn2(x)的算法

    问题分析:

    这道题算是两个多项式的组合?差不多,刚开始想觉得很多没想到,你一旦你开始想,理清楚其中的细节,这道题也就解出来了。

    Status PolyMinus(SqPoly  &L,  SqPoly &L1, SqPoly  &L2)

    {

       PolyTerm  *p, *p1,*p2;

       P=L.data;

       P1=L1.data;

       P2=L2.data;

    Int i=0,j=0,k=0;

    While(i<L1.length&&j<L2.length)

    {

      If(p1->exp==p2->exp)

      {

          

            P->coxl=(p1->cox1)-(p2->coxl);

            P->exp=p1->exp;

            P1=p1->next; p2=p2->next;

            P=p->next;

            I++;  j++;k++;

           

      }

     Else 

     { 

       P->coxl=p1->coxl;

       P->exp=p1->exp;

       P=p->next;

       P1=p1->nextl

       I++;

       K++;

       P->cox1=-(p2->coxl);

       P->exp=p2->exp;

       P=p->next;

       P2=p2->nextl

       j++;

       K++; 

     }

    }

    L.length=k;

    Return ok;

    }

    //coxl也就是coef 我弄错了。

    //自己写的算法虽然实现了大概的功能,但是没考虑到顺序,以及两项相减后为0的情况,它会自动消失?还有当两个表的长度不相等时?While循环跳出来就执行完了吗?还要进一步判断呢。。这个可能还是要细分,也就是说我的这个算法,考虑的情况不多,分类讨论的思想是很重要的,高中的数学题很多就是需要分类讨论,这个思想要培养出来。

    参考书上的代码:

    Status PolyMinus(SqPoly  &L,  SqPoly &L1, SqPoly  &L2)

    {

       PolyTerm  *p, *p1,*p2;

       P=L.data;

       P1=L1.data;

       P2=L2.data;

       Int i=0,j=0,k=0;

       While(i<L1.length&&j<L2.length)

    {

      If((p1->exp)>(p2->exp))

      {

          P->coxl= - (p2->coxl);

          P->exp=p2->exp;

          p2=p2->next;

          P=p->next;

          j++;k++;

     }  

    Else

    {

        If((p1->exp)<(p2->exp))

        {

          P->coxl=(p1->coxl);

          P->exp=p1->exp;

          P1=p1->next;

          P=p->next;

          i++;k++;

         }  

        Else{

              If(p1->coxl!=p2->cox1)

              {

                P->coxl=(p1->cox1)-(p2->coxl);

                P->exp=p1->exp;

                P=p->next;

                k++;

              }

           P1=p1->next; 

           p2=p2->next;

           I++;  j++;

          }

    }//else

    }//while

    While(i<L1.length)

    {

          P->coxl=(p1->coxl);

          P->exp=p1->exp;

          P1=p1->next;

          P=p->next;

          i++;k++;

    }

    While(j<L2.length)

    {

          P->coxl= - (p2->coxl);

          P->exp=p2->exp;

          p2=p2->next;

          P=p->next;

          j++;k++;

    }

     

    L.length=k;

    Return ok;

    }

  • 相关阅读:
    485串口接线
    mvc3 升级mvc5
    VB连接ACCESS数据库,使用 LIKE 通配符问题
    VB6 读写西门子PLC
    可用的 .net core 支持 RSA 私钥加密工具类
    解决 Win7 远程桌面 已停止工作的问题
    解决 WinForm 重写 CreateParams 隐藏窗口以后的显示问题
    解决安装 .net framework 发生 extracting files error 问题
    CentOS7 安装配置笔记
    通过特殊处理 Resize 事件解决 WinForm 加载时闪烁问题的一个方法
  • 原文地址:https://www.cnblogs.com/wj204/p/3044284.html
Copyright © 2011-2022 走看看