多项式
方法一:数组表示法
一般出现多项式问题,可以考虑幂次和项的系数的关系用一个数组表示ans[幂次] = 系数,这样可以对计数,相加减,输出结果都能提供很好的便利。
方法二:结构体表示法
struct pol{
int ep; //幂次
double cof; //系数
}ploy[1001]; //创建了一个多项式对象
1.1002 A+B for Polynomials (25分)
题目链接:
PAT 1002
1.1思路重点:
- 方法一与方法二的方式都可以
1.2特殊情况:
题目的特殊情况考虑是自己黑盒测试的一部分
- 对于总体的计数couter ,需要注意存在正负抵消的问题,因此需要在最后相加之后进行判断。
- 要注意数组溢出,如果是要将幂次作为索引的话,其范围不是1-k,而是至少为1001。
- 输出是按照幂次从大到小的顺序,并且double型需要保留一位小数
- 输出格式,最后没有空格
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.2特殊情况:
- 要注意数组溢出,如果是要将幂次作为索引的话,其范围不是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 ̄)づ╭❤~
关注我和我一起共勉加油
吧!
如果文章有错误,还望不吝指教!