线性表 ADT的使用 实验2


线性表ADT的使用(更新)


**

声明:我实在是太久没写博客了,突然想来写一个博客来划划水。这个实验二是真的麻烦,(对于我这个蒟蒻来说),写了一个一个小时多,最后写的自己都晕了,还是重新整理了思路才写了出来,希望读者不要直接的copy代码,这篇博客是给大家提供一个思路而已。大家整理思路,直接暴力还是很容易写出来的。 希望各位读者如果觉得我写的还不错的话 麻烦动动小手点个赞 谢谢。

**

更新内容

当加法,减法,或者求导刚好系数都为0时,应该输出C(x)=0而不是 C(x)=

新增样例

在这里插入代码片
C
1 2 3 4 0
1 2 3 4 0
S
X

输出结果

C(x)=0

实验二:一元多项式的基本运算
实验目的:掌握用线性表实现一元多项式的基本运算。
实验内容:使用链式存储实现一元多项式的加法、减法、乘法和求导。即:
C(x)= A(x)+B(x);C(x)= A(x)-B(x) C(x)= A(x)*B(x) C(x)= A’(x)
菜单:
1)C :分别创建两个多项式A(x)和B(x),其中 输入时按照 指数的升序顺序输入,遇到系数为0则停止。例如:输入 :
1 2 3 4 5 6 7 8
0 2 3 4 5 6 7 0 则生成的多项式分别为:
A(x)=x2+3x4+5x6+7x8
B(x)=2x3+4x5+6x^7
2)P:计算C(x)= A(x)+B(x),计算完毕后输出C(x)的 结果
3)S: 计算C(x)= A(x)-B(x),计算完毕后输出C(x)的 结果
4)M: 计算C(x)= A(x)*B(x),计算完毕后输出C(x)的 结果
5)D: 计算C(x)= A’(x),计算完毕后输出C(x)的 结果
6)V: 首先输入一个 float型数据,然后计算 A(x)并输出计算的结果。
7)C: 分别清空A(x)、B(x)、C(x)三个多项式。
8)X: 退出程序。
测试样例1`

C
1 2 3 4 5 6 7 8 0
2 3 4 5 6 7 0
S
P
M
D
V
2
X

输出结果

C(x)=x^2-2x^3+3x^4-4x^5+5x^6-6x^7+7x^8
C(x)=x^2+2x^3+3x^4+4x^5+5x^6+6x^7+7x^8
C(x)=2x^5+10x^7+28x^9+52x^11+58x^13+42x^15
C(x)=2x+12x^3+30x^5+56x^7
2164.00

测试样例2

C
2 2 0
2 2 3 3 0
P
S
M
D
V
3.1
X

输出结果

C(x)=4x^2+3x^3
C(x)=-3x^3
C(x)=4x^4+6x^5
C(x)=4x
19.22

测试样例 3

C
3 0 2 2 0
-2 2 3 3 0
M
V
2.1
P
S
D
X

输出结果

C(x)=-6x^2+9x^3-4x^4+6x^5
11.82
C(x)=3+3x^3
C(x)=3+4x^2-3x^3
C(x)=4x

思路

这个其实就是一个暴力题,我直接用结构体存储多项式,操作都是暴力的。多项式的输出写的是真的麻烦。
1.要注意考虑第一个输出的系数为正数时不用‘+’号,不是第一个输出的正系数都要加上‘+’号。
2.当多项式的系数为1或者-1时要省略系数。直接变为x^n 或者 -x^n
3.当幂次的系数为0时 直接输出多项式的系数当作常数项。
4.当幂次的系数为1时,更改输出方式为 nx 或者 -nx ,具体情况具体分析。
其他都是暴力的操作,希望大家在看代码的时候能够先理解 然后再自己动手写,编写代码只有自己亲自动手才能变得更强。
希望大家能够顺利过题。。


更新后的AC代码

#include 
#include 
#include 
#include 
using namespace std;
typedef long long ll;
const int N=1e5+7;
struct node
{
    int num[N+5],sum=0;
}a,b;
int main()
{
    char c;
    for(int i=0;i<N;i++) a.num[i]=0;
    for(int i=0;i<N;i++) b.num[i]=0;
    a.sum=0;
    b.sum=0;
    cin>>c;
    int x,y;
    while(cin>>x)
    {
        if(x==0) break;
        else
        {
            cin>>y;
            a.num[y]=x;
            a.sum=max(y,a.sum);
        }
    }
    while(cin>>x)
    {
        if(x==0) break;
        else
        {
            cin>>y;
            b.num[y]=x;
            b.sum=max(y,b.sum);
        }
    }
    int flag;
    while(cin>>c)
    {
        if(c=='P')
        {
            node s;
            for(int i=0;i<N;i++) s.num[i]=0;
            int maxn=max(a.sum,b.sum);
            for(int i=0;i<=maxn;i++) s.num[i]=a.num[i]+b.num[i];
            cout<<"C(x)=";
            int flagg=0;
            for(int i=0;i<=maxn;i++)
            {
                if(s.num[i]!=0)
                {
                    flagg=1;
                    break;
                }
            }
            if(flagg==0) cout<<0<<endl;
            else
            {
                flag=0;
            for(int i=0;i<=maxn;i++)
            {
                if(s.num[i]!=0)
                {
                   if(flag==0)
                   {
                       flag=1;
                       if(s.num[i]<0)
                       {
                           if(i==0) printf("%d",s.num[i]);
                           else if(i==1) printf("%dx",s.num[i]);
                           else
                           {
                               if(s.num[i]==-1) printf("-x^%d",i);
                               else printf("%dx^%d",s.num[i],i);
                           }
                       }
                       else
                       {
                           if(i==0) printf("%d",s.num[i]);
                           else if(i==1) printf("%dx",s.num[i]);
                           else
                           {
                               if(s.num[i]==1) printf("x^%d",i);
                               else printf("%dx^%d",s.num[i],i);
                           }
                       }
                   }
                   else
                   {
                       if(s.num[i]<0)
                       {
                           if(i==1) printf("%dx",s.num[i]);
                           else
                           {
                               if(s.num[i]==-1) printf("-x^%d",i);
                               else printf("%dx^%d",s.num[i],i);
                           }
                       }
                       else
                       {
                           if(i==1) printf("+%dx",s.num[i]);
                           else
                           {
                               if(s.num[i]==1) printf("+x^%d",i);
                               else printf("+%dx^%d",s.num[i],i);
                           }
                       }
                   }
                }
            }
            cout<<endl;
            }

        }
        else if(c=='S')
        {
            node s;
            for(int i=0;i<N;i++) s.num[i]=0;
            int maxn=max(a.sum,b.sum);
            for(int i=0;i<=maxn;i++) s.num[i]=a.num[i]-b.num[i];
            cout<<"C(x)=";
            int flagg=0;
            for(int i=0;i<=maxn;i++)
            {
                if(s.num[i]!=0)
                {
                    flagg=1;
                    break;
                }
            }
            if(flagg==0) cout<<0<<endl;
            else
            {
                flag=0;
            for(int i=0;i<=maxn;i++)
            {
                if(s.num[i]!=0)
                {
                   if(flag==0)
                   {
                       flag=1;
                       if(s.num[i]<0)
                       {
                           if(i==0) printf("%d",s.num[i]);
                           else if(i==1) printf("%dx",s.num[i]);
                           else
                           {
                               if(s.num[i]==-1) printf("-x^%d",i);
                               else printf("%dx^%d",s.num[i],i);
                           }
                       }
                       else
                       {
                           if(i==0) printf("%d",s.num[i]);
                           else if(i==1) printf("%dx",s.num[i]);
                           else
                           {
                               if(s.num[i]==1) printf("x^%d",i);
                               else printf("%dx^%d",s.num[i],i);
                           }
                       }
                   }
                   else
                   {
                       if(s.num[i]<0)
                       {
                           if(i==1) printf("%dx",s.num[i]);
                           else
                           {
                               if(s.num[i]==-1) printf("-x^%d",i);
                               else printf("%dx^%d",s.num[i],i);
                           }
                       }
                       else
                       {
                           if(i==1) printf("+%dx",s.num[i]);
                           else
                           {
                               if(s.num[i]==1) printf("+x^%d",i);
                               else printf("+%dx^%d",s.num[i],i);
                           }
                       }
                   }
                }
            }
            cout<<endl;
            }

        }
        else if(c=='M')
        {
            node s;
            for(int i=0;i<N;i++) s.num[i]=0;
            int cnt=a.sum*b.sum;
            for(int i=0;i<=a.sum;i++)
            {
                for(int j=0;j<=b.sum;j++)
                {
                    s.num[i+j]=s.num[i+j]+a.num[i]*b.num[j];
                }
            }
            cout<<"C(x)=";
            int flagg=0;
            for(int i=0;i<=cnt;i++)
            {
                if(s.num[i]!=0)
                {
                    flagg=1;
                    break;
                }
            }
            if(flagg==0) cout<<0<<endl;
            else
            {
                flag=0;
            for(int i=0;i<=cnt;i++)
            {
                if(s.num[i]!=0)
                {
                   if(flag==0)
                   {
                       flag=1;
                       if(s.num[i]<0)
                       {
                           if(i==0) printf("%d",s.num[i]);
                           else if(i==1) printf("%dx",s.num[i]);
                           else
                           {
                               if(s.num[i]==-1) printf("-x^%d",i);
                               else printf("%dx^%d",s.num[i],i);
                           }
                       }
                       else
                       {
                           if(i==0) printf("%d",s.num[i]);
                           else if(i==1) printf("%dx",s.num[i]);
                           else
                           {
                               if(s.num[i]==1) printf("x^%d",i);
                               else printf("%dx^%d",s.num[i],i);
                           }
                       }
                   }
                   else
                   {
                       if(s.num[i]<0)
                       {
                           if(i==1) printf("%dx",s.num[i]);
                           else
                           {
                               if(s.num[i]==-1) printf("-x^%d",i);
                               else printf("%dx^%d",s.num[i],i);
                           }
                       }
                       else
                       {
                           if(i==1) printf("+%dx",s.num[i]);
                           else
                           {
                               if(s.num[i]==1) printf("+x^%d",i);
                               else printf("+%dx^%d",s.num[i],i);
                           }
                       }
                   }
                }
            }
            cout<<endl;
            }

        }
        else if(c=='D')
        {
            node s;
            for(int i=0;i<N;i++) s.num[i]=0;
            for(int i=0;i<=a.sum-1;i++) s.num[i]=a.num[i+1]*(i+1);
            cout<<"C(x)=";
            int flagg=0;
            for(int i=0;i<=a.sum-1;i++)
            {
                if(s.num[i]!=0)
                {
                    flagg=1;
                    break;
                }
            }
            if(flagg==0) cout<<0<<endl;
            else
            {
                flag=0;
            for(int i=0;i<=a.sum-1;i++)
            {
                if(s.num[i]!=0)
                {
                   if(flag==0)
                   {
                       flag=1;
                       if(s.num[i]<0)
                       {
                           if(i==0) printf("%d",s.num[i]);
                           else if(i==1) printf("%dx",s.num[i]);
                           else
                           {
                               if(s.num[i]==-1) printf("-x^%d",i);
                               else printf("%dx^%d",s.num[i],i);
                           }
                       }
                       else
                       {
                           if(i==0) printf("%d",s.num[i]);
                           else if(i==1) printf("%dx",s.num[i]);
                           else
                           {
                               if(s.num[i]==1) printf("x^%d",i);
                               else printf("%dx^%d",s.num[i],i);
                           }
                       }
                   }
                   else
                   {
                       if(s.num[i]<0)
                       {
                           if(i==1) printf("%dx",s.num[i]);
                           else
                           {
                               if(s.num[i]==-1) printf("-x^%d",i);
                               else printf("%dx^%d",s.num[i],i);
                           }
                       }
                       else
                       {
                           if(i==1) printf("+%dx",s.num[i]);
                           else
                           {
                               if(s.num[i]==1) printf("+x^%d",i);
                               else printf("+%dx^%d",s.num[i],i);
                           }
                       }
                   }
                }
            }
            cout<<endl;
            }

        }
        else if(c=='V')
        {
            float t,ans=0,sz=1;
            cin>>t;
            for(int i=0;i<=a.sum;i++)
            {
                if(i!=0) sz=sz*t;
                ans+=a.num[i]*sz;
            }
            cout<<fixed<<setprecision(2)<<ans<<endl;
        }
        else if(c=='C')
        {
            for(int i=0;i<=a.sum;i++) a.num[i]=0;
            a.sum=0;
            for(int i=0;i<=a.sum;i++) b.num[i]=0;
            b.sum=0;
        }
        else if(c=='X')
        {
            break;
        }
    }
    return 0;
}

你可能感兴趣的:(2020年4月)