• 计算多项式


    http://acm.buaa.edu.cn/contest/185/problem/B/

    一元多项式的计算用链表实现,本题需要注意的是:

    1.系数为-1的项只输出负号,例如1-x^4+2x^8-3x^10+15x^14+4x^18

    2.当所有输入均为0时,输出结果0

    3.如果阶数较多的那个多项式剩下的项的系数为0不要建立新的结点

    否则会输出0x^160x^17

    #include <cstdio>
    #include <cstdlib>
    #define MAX 502
    
    typedef struct array
    {
    	double coef;
    	int exp;
    } PolyArray[MAX];
    
    typedef struct pnode
    {
    	double coef;
    	int exp;
    	struct pnode *next;
    }  PolyNode;
    void DispPoly(PolyNode *L)
    {
    	bool first=true;
    	PolyNode *p=L->next;
    	while (p!=NULL)
    	{
    		if (first)
    			first=false;
    		else if (p->coef>0)
    			printf("+");
    		if (p->exp==0)
    			printf("%g",p->coef);
    		else if (p->exp==1)
    		{
    		    if (p->coef==1)
                    printf("x");
                    else if (p->coef==-1)
                    printf("-x");
                    else
                    printf("%gx",p->coef);
    		}
                    else
    		{
    		    if (p->coef==1)
                    printf("x^%d",p->exp);
                    else if (p->coef==-1)
                    printf("-x^%d",p->exp);
                    else
                    printf("%gx^%d",p->coef,p->exp);
    		}
    
    		p=p->next;
    	}
    	printf("
    ");
    }
    void DestroyList(PolyNode *&L)
    {
    	PolyNode *p=L,*q=p->next;
    	while (q!=NULL)
    	{
    		free(p);
    		p=q;
    		q=p->next;
    	}
    	free(p);
    }
    void CreateListR(PolyNode *&L,PolyArray a,int n)
    {
    	PolyNode *s,*r;int i;
    	L=(PolyNode *)malloc(sizeof(PolyNode));
    	L->next=NULL;
    	r=L;
    	for (i=0;i<n;i++)
    	{
    		s=(PolyNode *)malloc(sizeof(PolyNode));
    		s->coef=a[i].coef;
    		s->exp=a[i].exp;
    		r->next=s;
    		r=s;
    	}
    	r->next=NULL;
    }
    
    void Sort(PolyNode *&head)
    {
    	PolyNode *p=head->next,*q,*r;
    	if (p!=NULL)
    	{
    		r=p->next;
    		p->next=NULL;
    		p=r;
    		while (p!=NULL)
    		{
    			r=p->next;
    			q=head;
    			while (q->next!=NULL && q->next->exp<p->exp)
    				q=q->next;
    			p->next=q->next;
    			q->next=p;
    			p=r;
    		}
    	}
    }
    void Add(PolyNode *ha,PolyNode *hb,PolyNode *&hc)
    {
    	PolyNode *pa=ha->next,*pb=hb->next,*s,*tc;
    	double c;
    	hc=(PolyNode *)malloc(sizeof(PolyNode));
    	tc=hc;
    	while (pa!=NULL && pb!=NULL)
    	{
    	        if     (pa->exp>pb->exp)
    		{
    			s=(PolyNode *)malloc(sizeof(PolyNode));
    			s->exp=pa->exp;s->coef=pa->coef;
    			tc->next=s;tc=s;
    			pa=pa->next;
    		}
    		else if (pa->exp<pb->exp)
    		{
    			s=(PolyNode *)malloc(sizeof(PolyNode));
    			s->exp=pb->exp;s->coef=pb->coef;
    			tc->next=s;tc=s;
    			pb=pb->next;
    		}
    		else
    		{
    			c=pa->coef+pb->coef;
    			if (c!=0)
    			{
    				s=(PolyNode *)malloc(sizeof(PolyNode));
    				s->exp=pa->exp;s->coef=c;
    				tc->next=s;tc=s;
    			}
    			pa=pa->next;
    			pb=pb->next;
    		}
    	}
    	if (pb!=NULL) pa=pb;//将阶数较多的那个多项式赋给pa
    	while (pa!=NULL)
    	{
    		        c=pa->coef;
    			if (c!=0)//如果剩下的项的系数为0就不建立新的结点
    			{
    			    s=(PolyNode *)malloc(sizeof(PolyNode));
    		            s->exp=pa->exp;s->coef=pa->coef;
                                tc->next=s;tc=s;
    			}
    
    		        pa=pa->next;
    	}
    	tc->next=NULL;
    }
    
    int main()
    {
        int n,m,i,j;
        while (~scanf("%d%d",&n,&m))
        {
            int g,h;
            g=n+1;
            h=m+1;
            PolyNode *ha,*hb,*hc;
            PolyArray a,b;
        for(i =0; i<MAX;i++ )
        {
            a[i].exp=0;
            a[i].coef=0;
        }
        for(j =0; j<MAX;j++ )
        {
            b[j].exp=0;
            b[j].coef=0;
        }
        for(i =0; i<n+1;i++ )
        {
            scanf("%lf",&a[i].coef);
        }
        for(j=0; j<m+1;j++ )
        {
            scanf("%lf",&b[j].coef);
        }
        for(i =0; i<n+1;i++ )
        {
            a[i].exp=i;
        }
        for(j =0; j<m+1;j++ )
        {
            b[j].exp=j;
        }
            CreateListR(ha,a,g);
    	CreateListR(hb,b,h);
    	Sort(ha);
    	Sort(hb);
    	Add(ha,hb,hc);
    	if(hc->next!=NULL)
    	{
    	    DispPoly(hc);
    	}
    	else
    	 printf("0
    ");
    	DestroyList(ha);//要实现多次输入输出必须在每轮结束后销毁链表
    	DestroyList(hb);
    	DestroyList(hc);
        }
    }
    
    


  • 相关阅读:
    Concurrent
    Java多线程状态切换
    Java中volatile如何保证long和double的原子性操作
    协程与线程
    线程饥饿
    线程活锁
    线程死锁
    Java Thread之start和run方法的区别
    ThreadLocal内存泄漏
    interrupt和interrupted和isInterrupted的区别
  • 原文地址:https://www.cnblogs.com/jenayfighting/p/5180396.html
Copyright © 2020-2023  润新知