多项式表达方法总结,例题解析:1002 A+B for Polynomials,

方法一:数组表示法

一般出现多项式问题,可以考虑幂次和项的系数的关系用一个数组表示ans[幂次] = 系数,这样可以对计数,相加减,输出结果都能提供很好的便利。

方法二:结构体表示法

struct pol{
	int ep; //幂次
	double cof; //系数
}ploy[1001];  //创建了一个多项式对象

1.1002 A+B for Polynomials (25分)

题目链接: PAT 1002

1.1思路重点:

  1. 方法一与方法二的方式都可以

1.2特殊情况:

题目的特殊情况考虑是自己黑盒测试的一部分

  1. 对于总体的计数couter ,需要注意存在正负抵消的问题,因此需要在最后相加之后进行判断。
  2. 要注意数组溢出,如果是要将幂次作为索引的话,其范围不是1-k,而是至少为1001。
  3. 输出是按照幂次从大到小的顺序,并且double型需要保留一位小数
  4. 输出格式,最后没有空格

1.3上代码

#include <cstdio>
#include <iostream>
using namespace std;
const int mMax = 11;
const int eMax = 1001;
int a_k,b_k,a_len,b_len;
int a_ep[mMax],b_ep[mMax];
double a_cf[mMax],b_cf[mMax];
double ans[eMax] = {0};
int main(){
	scanf("%d",&a_k);
	for(int i=0;i<a_k;i++){
		scanf("%d%lf",&a_ep[i],&a_cf[i]);
		ans[a_ep[i]] = a_cf[i];
	}
	scanf("%d",&b_k);
	for(int i=0;i<b_k;i++){
		scanf("%d%lf",&b_ep[i],&b_cf[i]);
		ans[b_ep[i]]+=b_cf[i];		
	}
	int couter = 0;
	for(int i=1001;i>=0;i--){
		if(ans[i]!=0) {
			couter++;
		}
	}
	printf("%d",couter);
	for(int i=1001;i>=0;i--){
		if(ans[i]) {
			printf(" %d %.1f",i,ans[i]);
		}
	}
	printf("\n");
	return 0;	
}

NOTE:
细想你会发现,其中没有必要区分第一个条数据和第二条数据,因此相同意义的变量,只需要定义一个就行了,精简后的代码如下:

#include <cstdio>
#include <iostream>
using namespace std;
const int mMax = 11;
const int eMax = 1001;
int k;
int ep[mMax];
double cf[mMax];//ep[i]表示exponents ,cf[i]表示 coefficients
double ans[eMax] = {0};
int main(){
	scanf("%d",&k);
	for(int i=0;i<k;i++){
		scanf("%d%lf",&ep[i],&cf[i]); 
		ans[ep[i]] = cf[i];
	}
	scanf("%d",&k);
	for(int i=0;i<k;i++){
		scanf("%d%lf",&ep[i],&cf[i]);
		ans[ep[i]]+=cf[i];		
	}
	int couter = 0;
	for(int i=1001;i>=0;i--){
		if(ans[i]!=0) {
			couter++;
		}
	}
	printf("%d",couter);
	for(int i=1001;i>=0;i--){
		if(ans[i]) {
			printf(" %d %.1f",i,ans[i]);
		}
	}	
	printf("\n");
	return 0;	
}

2.1009 Product of Polynomials

题目链接:PAT 1009

1.1思路重点:

  1. 方法一与方法二的方式都可以

1.2特殊情况:

  1. 要注意数组溢出,如果是要将幂次作为索引的话,其范围不是1-k,而是至少为1001,并且由于相乘的原因,对于存放答案的数组长度是单个数组长度的两倍。

1.3上代码

==采用方法一的代码:

#include <cstdio>
#include <iostream>
using namespace std;
const int eMax = 2020;
const int nMax = 11;
int a_k,b_k,a_ep[nMax],b_ep[nMax],couter=0;
double a_cf[nMax],b_cf[nMax],ans[eMax]={0};
int main(){
	scanf("%d",&a_k);
	for(int i=0;i<a_k;i++){
		scanf("%d%lf",&a_ep[i],&a_cf[i]);
	}
	scanf("%d",&b_k);
	for(int i=0;i<b_k;i++){
		scanf("%d%lf",&b_ep[i],&b_cf[i]);
		for(int j=0;j<a_k;j++){
			ans[a_ep[j]+b_ep[i]] += a_cf[j]*b_cf[i];
		}
	}
	for(int i=0;i<2002;i++){
		if(ans[i]){
			couter++;
		}
	} 
	printf("%d",couter);
	for(int i=2002;i>=0;i--){
		if(ans[i]) {
			printf(" %d %.1f",i,ans[i]);
		}
	}
	return 0;	
}

采用方法二的代码:

#include <cstdio>
#include <cstring> 
#include <iostream>
using namespace std;
struct pol{
	int ep;
	double cf;
}poly[1001];
double ans[2010]={0};
int main(){
	int n,m,number = 0;
	scanf("%d",&n);
	for(int i=0;i<n;i++){
		scanf("%d%lf",&poly[i].ep,&poly[i].cf);
	}
	scanf("%d",&m);
	for(int i=0;i<m;i++){
		int ep;
		double cf;
		scanf("%d%lf",&ep,&cf);
		for(int j=0;j<n;j++){
			ans[ep+poly[j].ep]+= (cf *poly[j].cf);
		}
	}
	for(int i=0;i<=2000;i++){
		if(ans[i])  number++;
	}
	printf("%d",number);
	for(int i=2000;i>=0;i--){
		if(ans[i]){
			printf(" %d %.1f",i,ans[i]);
		}
	}
	return 0;
}

勉励:
打卡第八天,加油ヾ(◍°∇°◍)ノ゙ 感悟:追求完美,注重细节

原创总结不易(#.#)
如果觉得我的文章对你有所帮助与启发,点赞给我个鼓励吧(づ ̄3 ̄)づ╭❤~
关注我和我一起共勉加油吧!
如果文章有错误,还望不吝指教!

原创文章 14 获赞 27 访问量 3545

猜你喜欢

转载自blog.csdn.net/qq_43992949/article/details/106033878