两个一元多项式相加(链表 || 顺序表实现)

顺序表实现:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <map>
using namespace std;
#define maxsize 1000
struct Data
{
    double coef;
	int exp;
};
struct List
{
	Data* elem;
	int length;
};
char s[100];
map <int, int> m;
bool cmp(Data a, Data  b)
{
	return a.exp < b.exp;
}
void InitList(List &L)
{
    L.elem = (Data* )new Data[maxsize];
    L.length = 0;
}
void Derivative(int len, List L)
{
    int n = 1,flag = 0;
    for(int i = 0;i < len;i ++)
    {
        double coef = L.elem[i].coef;
        int exp = L.elem[i].exp;
         if(exp == 0)
        {
            coef = 0;
        }
        else
        {
            coef *= exp;
            exp --;
        }
         if(fabs(coef) < 1e-6)
            continue;
         else
         {
            flag = 1;
            if(n != 1 && coef > 0)
                printf("+");
            if(exp == 0)
                printf("%g", coef);
            else if(coef!= 1 && exp != 0 && coef != -1)
            {
                if(exp == 1)
                    printf("%gx",coef);
                else
                    printf("%gx^%d",coef, exp);
            }
            else if(coef == 1)
            {
                if(exp == 1)
                    printf("x");
                else
                    printf("x^%d",exp);
            }
            else if(coef == -1)
            {
                if(exp == 1)
                    printf("-x");
                else
                    printf("-x^%d",exp);
            }
            n ++;
        }
    }
    if(!flag) printf("0");
    printf("\n");
}
int main()
{
	freopen("in.txt", "r", stdin);
	List L;
	int op1 = 1, op2 = 1,op3 = 1,op4 = 1;
	double a;
	int b, cases = 1,flag;
	while(scanf("%s", s) != EOF)
	{
        printf("Case %d:\n",cases++);
        InitList(L);
		op1 = op2 = op3 = op4 = 1;
		flag = 0;
		int len = strlen(s);
		for(int i = -10000;i <= 10000;i ++)
			m[i] = -1;
		int k = 0;
		for(int i = 0;i < len;i ++)
		{
            a = 0;
			b = 0;
			op1 = op2 = 1;
			if(s[0] == '-' && i == 0)
            {
                op4 = -1;
                i ++;
            }
            if(s[i+1] == '(')
            {
                Derivative(k, L);
                flag = 1;
            }
			if(s[i] == '=') break;
			if(s[i] == '(') continue;
			if(s[i] == ')')
			{

				i ++;
				op4 = 1;
				if(s[i] == '=')
                {
					 if(!flag)
                        Derivative(k, L);
                     break;
                }
				else
				{
                    flag = 1;
					Derivative(k, L);
					if(s[i] == '+')
						op3 = 1;
					else if(s[i] == '-')
						op3 = -1;

				}
			}
            if(s[i] == '-')
			{

				i ++;
				op1 = -1;
			}
			else if(s[i] == '+')
			{
				i ++;
				op1 = 1;
			}
			if(s[i] >= '0' && s[i] <= '9')
			{
				while(s[i] >= '0' && s[i] <= '9' && i < len)
				{
					a = a*10+(s[i]-'0');
					i ++;
				}
				if(s[i] == '.')
				{
					i ++;
					double x = 0.1;
					while(s[i] >= '0' && s[i] <= '9' && i < len)
					{
						a += x*(s[i]-'0');
						i ++;
						x *= 0.1;
					}
				}
				a = a*op1*op3*op4;
			}
			else if(s[i] == 'x')
			{
				a = op1*op3*op4;
			}
			if(s[i] == 'x')
			{
				i ++;
				if(s[i] == '^')
				{
					i ++;
					if(s[i] == '-')
					{
						op2 = -1;
						i ++;
					}
                    else if(s[i] == '+')
					{
						op2 = 1;
						i ++;
					}
					while(s[i] >= '0' && s[i] <= '9' && i < len)
					{
						b = b*10 + s[i] - '0';
						i ++;
					}
					b = b*op2;
					i --;
				}
				else
				{
					b = op2;
					i --;
				}
			}
			else
			{
				b = 0;
				i --;
			}
		    if(m[b] == -1)
			{
                L.elem[k].coef = a;
                L.elem[k].exp = b;
			    m[b] = k;
				k ++;
			}
			else
			{
				L.elem[m[b]].coef += a;
            }
        }
		sort(L.elem, L.elem+k, cmp);
		int flag = 0;
		int n = 1;
	    printf("%s", s);
		for(int i = 0;i < k;i ++)
		{
			if(fabs(L.elem[i].coef) < 1e-6)	continue;
			else
			{
				flag = 1;
				if(n != 1 && L.elem[i].coef > 0)
                    printf("+");
                if(L.elem[i].exp == 0)
                    printf("%g", L.elem[i].coef);
                else if(L.elem[i].coef != 1 && L.elem[i].exp != 0 && L.elem[i].coef != -1)
                {
                    if(L.elem[i].exp == 1)
                        printf("%gx",L.elem[i].coef);
                    else
                        printf("%gx^%d",L.elem[i].coef, L.elem[i].exp);
                }
                else if(L.elem[i].coef == 1)
                {
                    if(L.elem[i].exp == 1)
                        printf("x");
                    else
                        printf("x^%d",L.elem[i].exp);
                }
                else if(L.elem[i].coef == -1)
                {
                     if(L.elem[i].exp == 1)
                        printf("-x");
                    else
                        printf("-x^%d",L.elem[i].exp);
                }
				n ++;
			}
        }
		if(!flag) printf("0");
        printf("\n");
	}
	return 0;
}

链表实现:


#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <string>
#include <cmath>
#include "AddPolyn.h"
#include "Derivative.h"
using namespace std;
#define maxlen 1000
int main()
{
    char s[maxlen];
    int casen = 1;
    freopen("in.txt", "r", stdin);
    freopen("out.txt","w",stdout);
    while(scanf("%s", s) != EOF)
    {
        LNode* L1;
        init(L1);
        LNode* L2;
        init(L2);
        Inputpolyn(s, L1, L2);               //提取多项式中的系数和指数
        printf("Case %d :\n",casen ++);
        Deriv(L1);                           //求第一项的导数
        AddPolyn(L1, L2);                    //多项式相加
        printf("%s", s);
        print(L1);
        printf("\n");
    }
    return 0;
}


//Derivative.h
#ifndef DERIVATIVE_H_INCLUDED
#define DERIVATIVE_H_INCLUDED
void Deriv(LNode* L1)
{
    LNode* p = L1->next;
    double coef;
    int exp, n = 1, flag = 0;
    while(p)
    {
        coef = p->coef;
        exp = p->exp;
        if(exp == 0)
        {
            coef = 0;
        }
        else
        {
            coef *= exp;
            exp --;
        }
        //Êä³öµ¼Êý~~~~~~~~~~~~~~~~~~~~~~
         if(fabs(coef) < 1e-6)
        {
            p = p->next;
            continue;
        }
        else
        {
            flag = 1;
            if(n != 1 && coef > 0)
                printf("+");
            if(exp == 0)
                printf("%g", coef);
            else if(coef!= 1 && exp != 0 && coef != -1)
            {
                if(exp == 1)
                    printf("%gx",coef);
                else
                    printf("%gx^%d",coef, exp);
            }
            else if(coef == 1)
            {
                if(exp == 1)
                    printf("x");
                else
                    printf("x^%d",exp);
            }
            else if(coef == -1)
            {
                if(exp == 1)
                    printf("-x");
                else
                    printf("-x^%d",exp);
            }
            n ++;
        }
        p = p->next;
    }
    if(!flag) printf("0");
    printf("\n");
}
#endif // DERIVATIVE_H_INCLUDED

//AddPolyn.h
#ifndef INPUTPOLYN_H_INCLUDED
#define INPUTPOLYN_H_INCLUDED
struct LNode
{
    double coef;   //系数
    int exp;       //指数
    LNode *next;
};
void init(LNode* &L)
{
    L = (LNode*) new LNode;
    L -> next = NULL;
}
int compare(int x, int y)
{
    if(x == y) return 0;
    if(x < y) return 1;
    return -1;
}
void Insert(double coef, int exp, LNode* &L)
{
    LNode* p = L->next;
    LNode* q = L;
    while(p != NULL )
    {
        LNode *s;
        int flag = compare(exp, p->exp);
        if(flag == -1)     //比当前指数大
        {
            q = p;
            p = p->next;
        }
        else if(flag == 1) //比当前指数小
        {
            s = (LNode* )new LNode;
            s->coef = coef;
            s->exp = exp;
            s->next = p;
            q->next = s;
            return;
        }
        else if(flag == 0) //与当前指数相等
        {
            p->coef += coef;
            return;
        }
    }
    LNode*s = (LNode*) new LNode;
    s->coef = coef;
    s->exp = exp;
    s->next = NULL;
    q->next = s;
    return;


}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~读取多项式
void Inputpolyn(char s[], LNode* &L1, LNode* &L2)
{
    int op1 = 1,op2 = 1,op4 = 1,len,p;
    double a = 0;
    int b = 0;
    len = strlen(s);
    //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~读第一个多项式
    for(int i = 0; i < len; i ++)
    {
        a = 0;
        b = 0;
        op1 = op2 = 1;
        if(s[i] == '=')
            break;
        if(s[0] == '-' && i == 0)
        {
            op4 = -1;
            i ++;
        }
        if(s[i] == '(') continue;
        if(s[i] == ')')
        {
            p = i;
            break;
        }
        else if(s[i+1] == '(')
        {
            p = i-1;
            break;
        }
        if(s[i] == '-')
        {
            i ++;
            op1 = -1;
        }
        else if(s[i] == '+')
        {
            i ++;
            op1 = 1;
        }
        if(s[i] >= '0' && s[i] <= '9')
        {
            while(s[i] >= '0' && s[i] <= '9' && i < len)
            {
                a = a*10+(s[i]-'0');
                i ++;
            }
            if(s[i] == '.')
            {
                i ++;
                double x = 0.1;
                while(s[i] >= '0' && s[i] <= '9' && i < len)
                {
                    a += x*(s[i]-'0');
                    i ++;
                    x *= 0.1;
                }
            }
            a = a*op1*op4;
        }
        else if(s[i] == 'x')
        {
            a = op1*op4;
        }
        if(s[i] == 'x')
        {
            i ++;
            if(s[i] == '^')
            {
                i ++;
                if(s[i] == '-')
                {
                    op2 = -1;
                    i ++;
                }
                else if(s[i] == '+')
                {
                    op2 = 1;
                    i ++;
                }
                while(s[i] >= '0' && s[i] <= '9' && i < len)
                {
                    b = b*10 + s[i] - '0';
                    i ++;
                }
                b = b*op2;
                i --;
            }
            else
            {
                b = op2;
                i --;
            }
        }
        else
        {
            b = 0;
            i --;
        }
        //i --;
        //printf("%lf %d", a, b);
        Insert(a, b, L1);
    }
    //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~读第二个多项式
    op4 = 1;
    for(int i = p+1; i < len; i ++)
    {
        a = 0;
        b = 0;
        op1 = op2 = 1;
        if(s[i] == '-' && i == p+1)
        {
            op4 = -1;
            i ++;
        }
        else if(s[i] == '+' && i == p+1)
        {

            op4 = 1;
            i++;
        }
        if(s[i] == '=') break;
        if(s[i] == '(') continue;
        if(s[i] == ')')
        {
            i ++;
            if(s[i] == '=')
                break;
        }
        if(s[i] == '-')
        {
            i ++;
            op1 = -1;
        }
        else if(s[i] == '+')
        {
            i ++;
            op1 = 1;
        }
        if(s[i] >= '0' && s[i] <= '9')
        {
            while(s[i] >= '0' && s[i] <= '9' && i < len)
            {
                a = a*10+(s[i]-'0');
                i ++;
            }
            if(s[i] == '.')
            {
                i ++;
                double x = 0.1;
                while(s[i] >= '0' && s[i] <= '9' && i < len)
                {
                    a += x*(s[i]-'0');
                    i ++;
                    x *= 0.1;
                }
            }
            a = a*op1*op4;
        }
        else if(s[i] == 'x')
        {
            a = op1*op4;
        }
        if(s[i] == 'x')
        {
            i ++;
            if(s[i] == '^')
            {
                i ++;
                if(s[i] == '-')
                {
                    op2 = -1;
                    i ++;
                }
                else if(s[i] == '+')
                {
                    op2 = 1;
                    i ++;
                }
                while(s[i] >= '0' && s[i] <= '9' && i < len)
                {
                    b = b*10 + s[i] - '0';
                    i ++;
                }
                b = b*op2;
                i --;
            }
            else
            {
                b = op2;
                i --;
            }
        }
        else
        {
            b = 0;
            i --;
        }
        Insert(a, b, L2);
    }
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~两个多项式相加
void AddPolyn(LNode* &L1, LNode* &L2)
{
    LNode* p1 = L1->next, *p2 = L2->next, *r = L1, *q;
    //LNode* pre1 = L1,*pre2 = L2;
    while(p1 && p2)
    {
        int flag = compare(p1->exp, p2->exp);
        if(flag == 1)
        {
            r->next = p1;
            r = p1;
            //pre1= p1;
            p1 = p1->next;
        }
        else if(flag == -1)
        {
            r->next = p2;
            r = p2;
            //pre2 = p2;
            p2 = p2->next;
        }
        else if(flag == 0)
        {
            double sum = p1->coef + p2->coef;
            if(fabs(sum) < 1e-5)
            {
                if(L1->next == p1)
                    L1->next = p1->next;
                q = p1;
                p1 = p1->next;
                delete q;
            }
            else
            {
                p1->coef = sum;
                r->next = p1;
                r = p1;
                p1 = p1->next;
            }
            //if(pre2->next == p2)
            //pre2->next = p2->next;
            q = p2;
            p2 = p2->next;

            delete q;
        }
    }
    if(p1)
        r->next = p1;
    if(p2)
        r->next = p2;
    delete L2;
    L2 = q = p1 = p2 = r = NULL;
}
void print(LNode *L)
{
    int flag = 0,n = 1;
    LNode *p = L->next;
    while(p)
    {
        double coef = p->coef;
        int exp = p->exp;
        //cout << coef <<" "<<exp<<endl;
        if(fabs(coef) < 1e-6)
        {
            p = p->next;
            continue;
        }
        else
        {
            flag = 1;
            //if(n == 1) printf("(");
            if(n != 1 && coef > 0)
                printf("+");
            if(exp == 0)
                printf("%g", coef);
            else if(coef!= 1 && exp != 0 && coef != -1)
            {
                if(exp == 1)
                    printf("%gx",coef);
                else
                    printf("%gx^%d",coef, exp);
            }
            else if(coef == 1)
            {
                if(exp == 1)
                    printf("x");
                else
                    printf("x^%d",exp);
            }
            else if(coef == -1)
            {
                if(exp == 1)
                    printf("-x");
                else
                    printf("-x^%d",exp);
            }
            n ++;
        }
        p = p->next;
    }
    if(!flag) printf("0");
    //else printf(");");
    return;
}
#endif // INPUTPOLYN_H_INCLUDED

测试数据:

(2x+5x^8-3.1x^11)+(7-5x^8+11x^9)=
(6x^-3-x+4.4x^2-1.2x^9+1.2x^9)-(-6x^-3+5.4x^2-x^2+7.8x^15)=
(1+x+x^2+x^3+x^4+x^5)+(-x^3-x^4)=
(x+x^3)+(-x-x^3)=
(x+x^100)+(x^100+x^200)=
(x+x^2+x^3)+0=
(7-5x^8+11x^9)+(2x+5x^8-3.1x^11)=
-(-6x^-3+5.4x^2-x^2+7.8x^15)+(6x^-3-x+4.4x^2-1.2x^9+1.2x^9)=
(-x^3-x^4)+(1+x+x^2+x^3+x^4+x^5)=
(-x-x^3)+(x+x^3)=
(x+x^100)+(x^100+x^200)=
0+(x+x^2+x^3)=
(x+x)=
(1+x-x)+x=
(x-9+x^100)+(x-x^8)=
(-x+x)=
(23+10)=

输出结果(输出第一行为第一项的导数值):

Case 1 :
2+40x^7-34.1x^10
(2x+5x^8-3.1x^11)+(7-5x^8+11x^9)=7+2x+11x^9-3.1x^11
Case 2 :
-18x^-4-1+8.8x
(6x^-3-x+4.4x^2-1.2x^9+1.2x^9)-(-6x^-3+5.4x^2-x^2+7.8x^15)=12x^-3-x-7.8x^15
Case 3 :
1+2x+3x^2+4x^3+5x^4
(1+x+x^2+x^3+x^4+x^5)+(-x^3-x^4)=1+x+x^2+x^5
Case 4 :
1+3x^2
(x+x^3)+(-x-x^3)=0
Case 5 :
1+100x^99
(x+x^100)+(x^100+x^200)=x+2x^100+x^200
Case 6 :
1+2x+3x^2
(x+x^2+x^3)+0=x+x^2+x^3
Case 7 :
-40x^7+99x^8
(7-5x^8+11x^9)+(2x+5x^8-3.1x^11)=7+2x+11x^9-3.1x^11
Case 8 :
-18x^-4-8.8x-117x^14
-(-6x^-3+5.4x^2-x^2+7.8x^15)+(6x^-3-x+4.4x^2-1.2x^9+1.2x^9)=12x^-3-x-7.8x^15
Case 9 :
-3x^2-4x^3
(-x^3-x^4)+(1+x+x^2+x^3+x^4+x^5)=1+x+x^2+x^5
Case 10 :
-1-3x^2
(-x-x^3)+(x+x^3)=0
Case 11 :
1+100x^99
(x+x^100)+(x^100+x^200)=x+2x^100+x^200
Case 12 :
0
0+(x+x^2+x^3)=x+x^2+x^3
Case 13 :
2
(x+x)=2x
Case 14 :
0
(1+x-x)+x=1+x
Case 15 :
1+100x^99
(x-9+x^100)+(x-x^8)=-9+2x-x^8+x^100
Case 16 :
0
(-x+x)=0
Case 17 :
0
(23+10)=33


  • 4
    点赞
  • 56
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
好的,以下是按指数递增构造有序链表实现一元多项式相加的方法: 假设有两个一元多项式A和B,它们分别表示为: A(x) = a0 + a1x + a2x^2 + ... + anx^n B(x) = b0 + b1x + b2x^2 + ... + bmx^m 我们可以将它们的每一项系数与指数用一个结构体来表示: struct PolyNode { int coef; // 系数 int expn; // 指数 PolyNode *next; }; 接下来,我们可以按照指数递增的顺序,依次将A和B中的每一项插入到两个单独的链表中: PolyNode *CreatePoly(int n) { PolyNode *head = new PolyNode; // 创建头节点 head->next = NULL; PolyNode *p = head; // p指向当前节点 for (int i = 0; i < n; i++) { PolyNode *new_node = new PolyNode; new_node->next = NULL; cin >> new_node->coef >> new_node->expn; while (p->next != NULL && p->next->expn < new_node->expn) { p = p->next; // 找到第一个指数大于等于当前项的节点 } new_node->next = p->next; p->next = new_node; // 将当前项插入到链表中 p = head; // p重新指向头节点 } return head; } PolyNode *A = CreatePoly(n); PolyNode *B = CreatePoly(m); 接下来,我们可以定义一个新的链表C来表示A和B相加后的结果,同样按照指数递增的顺序将每一项插入到链表C中: PolyNode *AddPoly(PolyNode *A, PolyNode *B) { PolyNode *C = new PolyNode; // 创建头节点 C->next = NULL; PolyNode *p = A->next, *q = B->next, *r = C; // p和q分别指向A和B的当前节点,r指向C的当前节点 while (p != NULL && q != NULL) { if (p->expn < q->expn) { PolyNode *new_node = new PolyNode; new_node->coef = p->coef; new_node->expn = p->expn; new_node->next = NULL; r->next = new_node; r = new_node; // 将A中的当前项插入到C中 p = p->next; // p指向下一个节点 } else if (p->expn > q->expn) { PolyNode *new_node = new PolyNode; new_node->coef = q->coef; new_node->expn = q->expn; new_node->next = NULL; r->next = new_node; r = new_node; // 将B中的当前项插入到C中 q = q->next; // q指向下一个节点 } else { // 指数相同 int sum = p->coef + q->coef; if (sum != 0) { // 只有当系数之和不为0时,才需要插入新的节点 PolyNode *new_node = new PolyNode; new_node->coef = sum; new_node->expn = p->expn; new_node->next = NULL; r->next = new_node; r = new_node; // 将A和B中当前项的系数相加后插入到C中 } p = p->next; // p和q都指向下一个节点 q = q->next; } } while (p != NULL) { // 将A中剩余的项插入到C中 PolyNode *new_node = new PolyNode; new_node->coef = p->coef; new_node->expn = p->expn; new_node->next = NULL; r->next = new_node; r = new_node; p = p->next; } while (q != NULL) { // 将B中剩余的项插入到C中 PolyNode *new_node = new PolyNode; new_node->coef = q->coef; new_node->expn = q->expn; new_node->next = NULL; r->next = new_node; r = new_node; q = q->next; } return C; } PolyNode *C = AddPoly(A, B); 这样,我们就实现了按指数递增构造有序链表实现一元多项式相加的功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值