BUAA(2021春)多项式相乘

48 篇文章 154 订阅

看前须知

要点介绍和简要声明.

第三次上机题汇总

连续线段——结构体多级排序.

猴子选大王(约瑟夫问题)+3种解决约瑟夫问题的方法.

多项式相乘.

文件加密(环)——要求循环链表熟练的删除操作.

词频统计(数组或链表实现).

题目内容

问题描述

编写一个程序实现两个一元多项式相乘。

输入形式

首先输入第一个多项式中系数不为0的项的系数和指数,以一个空格分隔。且该多项式中各项的指数均为0或正整数,系数和最高幂次不会超过int类型的表示范围。对于多项式 anxn +a n-1 x n-1+…+ a1x1+ a0x0 的输入方法如下:
an n a n-1 n-1 … a1 1 a0 0
即相邻两个整数分别表示表达式中一项的系数和指数。在输入中只出现系数不为0的项。最后一项的指数后没有空格,只有一个回车换行符。
按照上述方式再输入第二个多项式。

输出形式

将运算结果输出到屏幕。将系数不为0的项按指数从高到低的顺序输出,每次输出其系数和指数,均以一个空格分隔,最后一项的指数后也可以有一个空格。

样例

【样例输入】

10 80000 2 6000 7 300 5 10 18 0
3 6000 5 20 8 10 6 0

【样例输出】

30 86000 50 80020 80 80010 60 80000 6 12000 21 6300 10 6020 31 6010 66 6000 35 320 56 310 42 300 25 30 130 20 174 10 108 0

样例说明

输入的两行分别代表如下表达式:
10x80000+ 2x6000 + 7x300 + 5x10 + 18
3x6000 + 5x20 + 8x10 + 6
相乘结果为:
30x86000 + 50x80020 + 80x80010 + 60x80000 + 6x12000 + 21x6300 + 10x6020 + 31x6010 + 66x6000+ 35x320 + 56x310 + 42x300 + 25x30 + 130x20 + 174x10 + 108

题解

易错点和难点

本题不难,主要一个是读入,一个是计算。

对于读入,我们需要用do while来进行读入,在读入的过程中,顺便记录多项式的项数。

对于计算,有一个需要注意的一点,就是可能会出现很多的指数相同的项,所以我们计算(系数相乘,指数相加)完后,我们需要进行去重操作。但是此处有技巧,如果有指数相同的项,我们只需要保留第一项即可,如果不是,可能会造成不必要的麻烦。

参考代码

#include<stdio.h>
#include<string.h>
#include<math.h>
#include<stdlib.h>
#include<ctype.h>
struct expression{			//多项式结构体 
	int coe;				//系数 
	int pow;				//指数 
};
typedef struct expression ex;
ex a[2000],b[2000],c[2000];//a是第一个多项式,b是第二个多项式 ,c是最后相乘的多项式 
int cmp(const void*p1,const void*p2);
int main()
{	
	int i,j,k=0;
	int n=0,nn=0;//n是第一个多项式的项数 ,nn是第二个多项式的项数  
	char ch;
	do   //读入第一个多项式 
	{
		scanf("%d%d%c",&a[n].coe,&a[n].pow,&ch);
		n++;
	}while(ch!='\n');
	do	//读入第二个多项式
	{
		scanf("%d%d%c",&b[nn].coe,&b[nn].pow,&ch);
		nn++;
	}while(ch!='\n');
	qsort(a,n,sizeof(ex),cmp); //按指数排序 
	qsort(b,nn,sizeof(ex),cmp);	//按指数排序 
	for(i=0;i<n;i++)
	{
		for(j=0;j<nn;j++)
		{
			c[k].coe=a[i].coe*b[j].coe;//系数相乘 
			c[k].pow=a[i].pow+b[j].pow;//指数相加 
			k++;
		}
	}
	qsort(c,k,sizeof(ex),cmp);//根据指数排序 
	for(i=0;i<k;i++)
	{
		if(c[i].pow == c[i+1].pow && c[i].pow!=0)//指数一样的进行去重操作 
		{
			c[i+1].coe+=c[i].coe;//指数一样的进行去重操作 
			c[i].coe=0;//去重项系数设为零 
		}
	}
	qsort(c,k,sizeof(ex),cmp);//根据指数排序 
	for(i=0;i<k;i++)
	{
		if(c[i].coe==0)//去重项不输出 
		{
			continue;
		}
		else
		{
			printf("%d %d ",c[i].coe,c[i].pow);//输出 
		}
	}
	return 0;
}
int cmp(const void*p1,const void*p2)
{
	struct expression *a=(struct expression*)p1;
	struct expression *b=(struct expression*)p2;
	return b->pow-a->pow;
}

补充测试的数据

输入

123 346 3456 123 1344 54 678 34 1345 1 134 0
23452 123 562 56 567 23 535763 4 4567 2

输出

2884596 469 69126 402 69741 369 65898849 350 561741 348 81050112 246 1942272 179 31519488 177 15900456 157 1959552 146 1851596928 127 15783552 125 31542940 124 3142568 123 755328 110 381036 90 762048 77 720065472 58 1140316 57 6213356 56 363247314 38 3096426 36 762615 24 75978 23 720601235 5 71792242 4 6142615 3 611978 2
  • 5
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值