设计函数分别求两个一元多项式的乘积与和。
输入格式:**
输入分2行,每行分别先给出多项式非零项的个数,再以指数递降方式输入一个多项式非零项系数和指数(绝对值均为不超过1000的整数)。数字间以空格分隔。
输出格式:
输出分2行,分别以指数递降方式输出乘积多项式以及和多项式非零项的系数和指数。数字间以空格分隔,但结尾不能有多余空格。零多项式应输出0 0。
输入样例:
4 3 4 -5 2 6 1 -2 0
3 5 20 -7 4 3 1
输出样例:
15 24 -25 22 30 21 -10 20 -21 8 35 6 -33 5 14 4 -15 3 18 2 -6 1
5 20 -4 4 -5 2 9 1 -2 0
大致思路
定义系数和指数放在一个多项式的结构体内,利用循环和选择进行加法
①首先比较分为三种不同的情况,指数相等,指数较大,指数较小。大的直接放入加法结果的数组中,小的将另一个多项式放入加法结果的数组中,相等则相加后再放入数组中。
②其次检查其中是否有系数为0的情况,有就直接删除就好。
③还有几种特殊的关于0的情况,直接看代码应该就懂。
乘法稍微复杂一点
①利用两层循环将所有的乘法结果放入数组中
②按照指数从大到小的顺序排列
③合并同类项,这里有两种情况,一是直接合并,合并之后后面的依次补上,另一种是合并同类项后系数为0,这要向前移动两位(这个有点难想到)
= =剩下的就是为了全部正确,各种打印输出了
#define N 30
#include <stdio.h>
typedef struct{
int coef;//系数
int expon;//指数
}polynomial,*Poly;
polynomial poly1[N],poly2[N],mul[N],add[N];
int m,n;
int i,j;
int temp;
//输入函数
void Input()
{
scanf("%d",&m);
for(i=0;i<m;i++)
scanf(" %d %d",&poly1[i].coef,&poly1[i].expon);
scanf("%d",&n);
for(i=0;i<n;i++)
scanf(" %d %d",&poly2[i].coef,&poly2[i].expon);
}
//计算加法结果
void Add()
{
i=0;j=0; temp=0;
while(i<m||j<n)
{
switch(Compare(poly1[i].expon,poly2[j].expon))
{
case 1://前者小,将后者放入当前数组中,并自增
add[temp++].expon=poly2[j].expon;
add[temp-1].coef=poly2[j].coef;
j++;
break;
case 2://后者小,将前者放入当前数组中,并自增
add[temp++].expon=poly1[i].expon;
add[temp-1].coef=poly1[i].coef;
i++;
break;
case 0://二者相等相加后结果放入当前数组中
add[temp++].coef=poly1[i].coef+poly2[j].coef;
add[temp-1].expon=poly1[i].expon;
i++;
j++;
break;
default:
break;
}
}
for(i=0;i<temp;i++)
{
if(!add[i].coef)
{
for(j=i;j<temp;j++)
{
add[j].coef=add[j+1].coef;
add[j].expon=add[j+1].expon;
}
}
}
if(add[0].coef==0)
{
printf("0 0");
}
else{
printf("%d %d",add[0].coef,add[0].expon);
for(i=1;i<temp;i++)
{
if(add[i].coef)
printf(" %d %d",add[i].coef,add[i].expon);
}
}
}
//比较两个数的大小
int Compare(int k,int j)
{
if(k==j)
return 0;//相等返回0
else if(k<j)
return 1;//前者小返回1
else
return 2;//后者小返回2
}
void multiplication()
{ //将乘法结果存入mul数组中
temp=0;
for(i=0;i<m;i++)
{
for(j=0;j<n;j++)
{
mul[temp++].coef=poly1[i].coef*poly2[j].coef;
mul[temp-1].expon=poly1[i].expon+poly2[j].expon;
}
}
int temp1,temp2;
for(j=0;j<temp;j++)//按从大到小的顺序排列
for(i=0;i<temp;i++)
if(mul[i].expon<mul[i+1].expon)
{
temp1=mul[i].coef; temp2=mul[i].expon;
mul[i].coef=mul[i+1].coef; mul[i].expon=mul[i+1].expon;
mul[i+1].coef=temp1; mul[i+1].expon=temp2;
}
int flag=0;
for(i=0;i<temp;i++)//合并同类项,合并后系数为零时,向前移动两位
{
if(mul[i].expon==mul[i+1].expon)
{
if((mul[i].coef+mul[i+1].coef)==0)
{
for(j=i;j<temp;j++)
{
mul[j].coef=mul[j+2].coef;
mul[j].expon=mul[j+2].expon;
}
}
else{
mul[i].coef+=mul[i+1].coef;
for(j=i+1;j<temp;j++)
{
mul[j].coef=mul[j+1].coef;
mul[j].expon=mul[j+1].expon;
}
}
flag++;
}
}
temp-=flag;
if(mul[0].coef==0)
{
printf("0 0");
}
else{
printf("%d %d",mul[0].coef,mul[0].expon);//根据标记进行不同的输出
if(flag>1){
for(i=1;i<temp+2;i++)
{
if(mul[i].coef)
printf(" %d %d",mul[i].coef,mul[i].expon);
}
}
else{
for(i=1;i<temp+1;i++)
{
if(mul[i].coef)
printf(" %d %d",mul[i].coef,mul[i].expon);
}
}
}
}
int main()
{
Input();
if(!m&&!n)
printf("0 0\n0 0");
else if(!m||!n){
printf("0 0\n");
Add();
}
else{
multiplication();
printf("\n");
Add();
}
return 0;
}
多多指教~