课程:程序设计入门——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");
}