1. 程式人生 > >兩個一元多項式相加(連結串列 || 順序表實現)

兩個一元多項式相加(連結串列 || 順序表實現)

順序表實現:

#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