7-23 一元多项式的加法运算

文章提供了一个C语言程序,用于计算并输出两个一元多项式的和。程序首先定义了一个结构体来存储幂次和系数,然后读取两个多项式的各项,合并系数,最后按照指定格式输出结果。处理了多项式可能为零的情况,并确保不会打印系数为零的项。
摘要由CSDN通过智能技术生成

求两个一元多项式的和。

输入格式:

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

(1)每行输入两个数字,第一个表示幂次,第二个表示该幂次的系数,遇到-1 -1表示一个多项式输入结束;

(2)所有的系数都是整数,不输入系数为0的数据项;

(3)每个多项式的幂值不超过100,且不重复。

输出格式:

从最高幂开始依次降到0幂,不输出系数为0 的项。如:

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

注意:其中的x是小写字母x,而且所有的符号之间都没有空格。

输入样例1:

在这里给出一组输入。例如:

6 2
5 3
3 12
1 6
0 20
-1 -1
6 2
5 3
2 12
1 6
0 20
-1 -1

输出样例1:

在这里给出相应的输出。例如:

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

输入样例2:

在这里给出一组输入。例如:

6 1
1 1
-1 -1
5 -1
0 -1
-1 -1

输出样例2:

在这里给出相应的输出。例如:

x6-x5+x-1

输入样例3:

在这里给出一组输入。例如:

1 1
-1 -1
1 -1
-1 -1

输出样例3:

在这里给出相应的输出。例如:

0

感觉好烦人啊,一直有几个点过不去,搞了快一晚上,感觉还没有吃透,得多复习。

#include <stdio.h> /*巨烦人的一题*/
typedef struct wz
{  int mi;
   int xi;	 /*结构体包含幂次和系数*/
}wz;
int main()
{  int mi,xi;
   int i,j=0,flag=1;/*都有用*/	
   wz a[1001];	
   for(i=0;i<101;i++)
   {   /*本来写了a[i].mi=i,但是后来改了几次感觉直接把i当成幂次就行*/
   	  a[i].xi=0;
   }
   while(1)   /*输入*/
  {  scanf("%d%d",&mi,&xi);
  	 if(mi==-1&&xi==-1) break;
  	 a[mi].xi+=xi;
  }	
   while(1) /*输入*/
  {  scanf("%d%d",&mi,&xi);
	 if(mi==-1&&xi==-1) break;
	  a[mi].xi+=xi;
  }	/*下面的a[i].xi都是每一个幂次前的总系数*/
  for(i=100;i>=0;i--)
  { if(a[i].xi!=0)/*可能会出现多项式为0的情况,用flag标记*/
   { flag=0;/*标记为0*/
  	 j++;/*用j来判断是否输出+*/
  	if(i!=100&&a[i].xi>0)/*i!=100表明不是第一项,系数大于0*/
  	 {  if(j>1)/*j从0开始,如果j>1,说明至少是第二项,那就可以输出+,第一项是不可以的*/
	  printf("+");
	 }
  	 if(i!=100&&a[i].xi<0)
  	 {   printf("-");/*系数小于0,直接输出一个-*/
	   a[i].xi=-a[i].xi;/*然后把小于0的化成绝对值,后面直接输出绝对值*/	
	 }
	if(i==0)/*幂次为0(用i标记幂次)*/
	 { /*x0次方为1,直接输出系数*/
	   printf("%d",a[i].xi);/*如果系数是负的,无所谓,前面已经输出-了,这次直接输出数*/
	 }
	else if(i==1&&a[i].xi==1)/*幂次为1要判断系数是1.-1或者都不是*/
	 {
	 	printf("x");/*这种系数为1的情况就直接输出x就行了,(幂次为1)*/
	 }
	else/*系数不为1*/
	{ if(i==1)/*幂次为1*/
	   printf("%dx",a[i].xi);/*直接输出系数*/	
	  else/*系数不为1*/
	  { if(a[i].xi!=1&&a[i].xi!=-1)/*系数不为1也不为-1*/
	  	 printf("%dx%d",a[i].xi,i);/*正常输出前系数中间x后面幂次*/
	  	else if(a[i].xi==1||a[i].xi==-1) //系数为1或-1,前面已经输出过符号
     	 printf("x%d",i);                //并且把负数变成正数了,所以直接输出就好*/
	  }	
	}
   }
  }
  /*flag没变表示系数一直为0,所以最后输出0*/
  if(flag==1) printf("0");
  return 0;
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值