文档章节

多项式的加分和乘法

 阿豪boy
发布于 2017/02/25 11:13
字数 557
阅读 3
收藏 0

https://www.patest.cn/contests/pat-a-practise/1002

多项式的加法

可以将多个多项式看成一个多项式,进行化简即可

1,令p[MAX]表示多项式,其中p[n]表示幂次为n的项的系数,初值为0,count表示系数非零项的个数,初值为0

2,先按照输入格式读入第一个多项式,在读入第二个多项式,并把对应系数直接加到第一个多项式上

3,计算非零项的个数并输出非零项

4,由于可能出现抵消的情况,count的计算应在最后化简后

#include <iostream>
#include <cstdio>
using namespace std;
const int MAX=1111;
double p[MAX] ={0};
int main(int argc, char *argv[])
{
	int k,n,count=0;
	double a;
	scanf("%d",&k);
	for(int i=0;i<k;i++){
		scanf("%d %lf",&n,&a);
		p[n] += a;
	}	 
	scanf("%d",&k);
	for(int i=0;i<k;i++){
		scanf("%d %lf",&n,&a);
		p[n] += a;
	}
	
	for(int i=0;i<MAX;i++){
		if(p[i]!=0) count++; 
	}
	printf("%d",count);
	for(int i=MAX-1;i>=0;i--)
		if(p[i]!=0) printf(" %d %.1lf",i,p[i]);
	return 0;
}

 

 

乘法

我的代码,转换为加法,需要引入ans数组

#include <iostream>
#include <cstdio>
const int MAX = 2020;
double p[MAX] = { 0 };
double ans[MAX] = { 0 };
using namespace std;
int main(int argc, char *argv[]) {
	int n, k, m;
	double t;
	int cnt = 0;
	scanf("%d", &n);
	for (int i = 0; i < n; i++) {
		scanf("%d %lf", &k, &t);
		p[k] += t;
	}
	scanf("%d", &m);
	for (int i = 0; i < m; i++) {
		scanf("%d %lf", &k, &t);
		for (int j = 0; j < MAX; j++) {
			if (p[j] != 0.0) {
				int a;
				double b;
				a = j + k;
				b = p[j] * t;
				ans[a] += b;
			 
			}

		}
	}
	cnt = 0;
	for (int i = 0; i < MAX; i++)
		if (ans[i] != 0.0) cnt++;
	printf("%d", cnt);

	for (int i = MAX-1; i >= 0; i--)
		if (ans[i] != 0.0)
			printf(" %d %.1lf", i, ans[i]);
	return 0;
}

 

其他做法

#include <iostream>
#include <cstdio>
using namespace std;
struct Poly{
	int exp;	//指数 
	double cof;	//系数 
}p[1010];		//第一个多项式

double ans[2020];//存放结果
 
int main(int argc, char *argv[])
{
	int n,m,cnt=0;
	scanf("%d",&n);
	for(int i=0;i<n;i++)
		scanf("%d %lf",&p[i].exp,&p[i].cof);
	scanf("%d",&m);
	for(int i=0;i<m;i++){
		int exp;
		double cof;
		scanf("%d %lf",&exp,&cof);	//第二个多项式的指数和系数
		for(int j=0;j<n;j++)
			ans[exp+p[j].exp] += (cof*p[j].cof); 
	}
	for(int i=0;i<=2000;i++)
		if(ans[i]!=0.0 ) cnt++;
	printf("%d",cnt);
	for(int i=2000;i>=0;i--)
		if(ans[i]!=0.0)
			printf(" %d %.1lf",i,ans[i]);
			
	return 0;
}

 

© 著作权归作者所有

共有 人打赏支持
粉丝 23
博文 1098
码字总数 740237
作品 0
西安
数学竖式排版中不为人知的技巧

在使用mathtype的过程中,难免会遇到一些不知道怎么操作的情况,这个时候我们就需要去找一些教程来学习一下。数学数式一般涉及到三种类型,即算术“加、减、乘、除”的竖式,代数多式加法、乘...

学术研究软件
2016/05/03
90
0
【4C练习题】一元多项式的乘法与加法运算(20 分)

传送门 // 感觉这道题还是挺坑的, 做法当然是模拟来做. 就是可能有一个点大家没理解清楚, 那就是说的系数为0的项不进行输出, 如果最后没有项, 那么在输出零多项式(即 0, 0), 剩下的做法就是模...

Anxdada
02/01
0
0
用链表实现一元多项式的加、减、乘、求导运算

  在数据结构线性表的链表学习中有一个很有趣的题目:计算两个多项式的加、减、乘和多项式的导数。   题目不难,将多项式的系数和指数存进链表,然后进行相应操作即可。   一、加法: ...

Jung_zhang
2015/09/09
0
0
bzoj5250 九省联考 秘密袭击【树上背包+拉格朗日插值+线段树合并】

解题思路: 设 将第三维用生成函数的形式表达,即: 再设Gu,i 是u 子树内Fv,i 之和,那么答案就是∑i=1WG1,i 中k 次项之后所有系数之和。 如果暴力维护多项式乘法是O(n4)或O(n3logn) 的。 注...

cdsszjj
04/18
0
0
[codevs3123]大整数乘法(快速傅立叶变换FFT)

【题意】 给出两个整数a和b,输出a*b的值 【输入】 输入两行 第一行输入a 第二行输入b 【输出】 输出一行 输出a*b 【样例输入】 2 3 【样例输出】 6 【提示】 1<=a<=10^100000,1<=b<=10^100...

CABI_ZGX
2017/12/03
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

docker中安装了RabbitMQ后无法访问其Web管理页面

在官网找了"$ docker run -d --hostname my-rabbit --name some-rabbit -p 8080:15672 rabbitmq:3-management"这条安装命令,在docker上安装了RabbitMQ,,结果输入http://localhost:8080并不......

钟然千落
30分钟前
0
0
spring-cloud | 分布式session共享

写在前面的话 各位小伙伴,你们有福了,这一节不仅教大家怎么实现分布式session的问题,还用kotlin开发,喜欢kotlin的小伙伴是不是很开心! 以前在写Android的时候,就对客户端请求有一定的认...

冯文议
49分钟前
0
0
c语言之内存分配笔记

先看一个数组: short array[5] = {1,2} // 这儿定义的一个int类型的数组,数组第1和第2个元素值是1和2.其余后面默认会给值为0; 或者 short array[] = {1,2};//这儿数组第1和第2个元素,数组...

DannyCoder
今天
4
0
Shell | linux安装包不用选择Y/N的方法

apt-get install -y packageOR echo "y" | sudo apt-get install package

云迹
今天
2
0
Hadoop的大数据生态圈

基于Hadoop的大数据的产品圈 大数据产品的一句话概括 Apache Hadoop: 是Apache开源组织的一个分布式计算开源框架,提供了一个分布式文件系统子项目(HDFS)和支持MapReduce分布式计算的软件架...

zimingforever
今天
7
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部