【C】多项式加法

课程:程序设计入门——C语言翁恺


题目内容:

一个多项式可以表达为x的各次幂与系数乘积的和,比如:

2x6+3x5+12x3+6x+20

现在,你的程序要读入两个多项式,然后输出这两个多项式的和,也就是把对应的幂上的系数相加然后输出。

程序要处理的幂最大为100。

输入格式:

总共要输入两个多项式,每个多项式的输入格式如下:

每行输入两个数字,第一个表示幂次,第二个表示该幂次的系数,所有的系数都是整数。第一行一定是最高幂,最后一行一定是0次幂。

注意第一行和最后一行之间不一定按照幂次降低顺序排列;如果某个幂次的系数为0,就不出现在输入数据中了;0次幂的系数为0时还是会出现在输入数据中。

输出格式:

从最高幂开始依次降到0幂,如:

2x6+3x5+12x3-6x+20

注意其中的x是小写字母x,而且所有的符号之间都没有空格,如果某个幂的系数为0则不需要有那项。

输入样例:

6 2

5 3

3 12

1 6

0 20

6 2

5 3

2 12

1 6

0 20

输出样例:

4x6+6x5+12x3+12x2+12x+40

时间限制:500ms 内存限制:32000kb

思路和实现:

原题要求用数组,这里改用单链表实现。要注意的点有:

1. 输入数据不一定按照降幂顺序,所以要对多项式各项重新按降幂排序,采用插入排序法。

2. 输出多项式时要考虑系数和幂的多种情况,格式有差异。

C语言代码:

#include <stdio.h>
#include <stdlib.h>

typedef struct poly{
    int expo;
    int coef;
    struct poly *next;
} *Poly;

Poly ReadPoly();
Poly Add(Poly p1, Poly p2);
void Print(Poly p);

int main(){
    Poly p1, p2, p;
    p1 = ReadPoly();
//    Print(p1);
    p2 = ReadPoly();
//    Print(p2);
    p = Add(p1, p2);
    Print(p);
    return 0;
}

/*
采用插入排序法,对读取的多项式按单项式幂从大到小重新排序;	
*/
Poly ReadPoly(){
    Poly polynomial, a, temp;
    polynomial = (Poly)malloc(sizeof(struct poly));
    polynomial->next = NULL;
    while(1){
        Poly P = (Poly)malloc(sizeof(struct poly));
        scanf("%d %d", &(P->expo), &(P->coef));
        P->next = NULL;
		a = polynomial;
		while(a->next != NULL && P->expo < a->next->expo ){
			a = a->next;
		}
		P->next = a->next;
		a->next = P;

        if(P->expo == 0){
            break;
        }
    }    

    temp = polynomial;
    polynomial = polynomial->next;
    free(temp);
    return polynomial;
}

Poly Add(Poly p1, Poly p2){
    Poly s1, s2, polynomial, rear, temp;
    s1 = p1;
    s2 = p2;
    polynomial = (Poly)malloc(sizeof(struct poly));
    polynomial->next = NULL;
    rear = polynomial;
    while(s1 && s2){
        if(s1->expo > s2->expo){
            rear->next = s1;
            rear = rear->next;
            s1 = s1->next;
        }
        else if(s1->expo == s2->expo){
            int c = s1->coef + s2->coef;
            if(c != 0){
                temp = (Poly)malloc(sizeof(struct poly));
                temp->coef = c;
                temp->expo = s1->expo;
                rear->next = temp;
                rear = rear->next;
            }
            s1 = s1->next;
            s2 = s2->next;
        }
        else{
            rear->next = s2;
            rear = rear->next;
            s2 = s2->next;
        }
    }
    while(s1){
        rear->next = s1;
        rear = rear->next;
        s1 = s1->next;
    }
    while(s2){
        rear->next = s2;
        rear = rear->next;
        s2 = s2->next;
    }
    /*多项式和为0的情况*/
    if(polynomial->next == NULL){
    	Poly zero = (Poly)malloc(sizeof(struct poly));
    	zero->coef = 0;
    	zero->expo = 0;
    	zero->next = NULL;
    	rear->next = zero;
    	rear = rear->next;
	} 
    temp = polynomial;
    polynomial = polynomial->next;
    free(temp);
    return polynomial;
}

void Print(Poly p){
	if(p->coef == 0){
		printf("0");
		return;
	}
	
    int flag = 0;
    while(p){
        if(flag++){
            if(p->coef > 0){
                printf("+");
            }
        }
        if(p->expo == 0){
            printf("%d",p->coef);
            break;
        }
        else if(p->expo == 1){
            if(p->coef == 1){printf("x");}
            else if(p->coef>1 || p->coef<-1){printf("%dx",p->coef);}
		    else if(p->coef == -1){printf("-x");}
		    p = p->next;
		}
		else{
			if(p->coef == 1){printf("x%d", p->expo);}
			else if(p->coef == -1){printf("-x%d", p->expo);}
			else if(p->coef>1 || p->coef<-1){printf("%dx%d", p->coef, p->expo);}
			p = p->next;
		}
    }
    printf("\n");
}
发布了37 篇原创文章 · 获赞 47 · 访问量 10万+

猜你喜欢

转载自blog.csdn.net/u013378642/article/details/105258854