您的位置:首页 > 编程语言 > C语言/C++

1002. A+B for Polynomials (25)

2017-10-25 16:31 429 查看

1. 原题链接

1002. A+B for Polynomials (25)

2. 理解题目

通过指数(exp)和系数(coe)的形式输入两个多项式中系数不为0的项,且按照指数递减的顺序输入,求相加后的结果(也按照指数递减的顺序输出)。


3. 解题思路

[思路1]

定义结构体数组来保存多项式,结构体中exp记录指数,coe记录系数;声明结构体数组变量a[],b[],ans[]分别保存输入的两个多项式和结果多项式,此时a、b数组内的指数都是递减的;然后用p1,p2,p这三个"指针"指向三个数组的下标,比较p1和p2指向元素的指数:
①如果相同,则系数相加,指数任取其一,保存进p所指的ans[]元素内;然后p,p1,p2都"指向下一个元素";
②如果不同,将指数较大的元素保存到ans[]中,并将p和指数较大的对应的指针"指向下一个元素";


[思路2]

直接用double数组来存储多项式信息,下标(非负整数类型)存储exp,数组内容(double类型)存储coe;然后第二次输入多项式信息时,直接将系数加入以exp作为下标的数组内;最终输出系数不为0的项即可;


4. 注意点

①注意系数相加后可能为0;
②解法2时,注意初始化数组为0;


5. AC代码

//watch out the coefficient of ans[i] may be zero
//[解法1]
#include<cstdio>
const int maxn=1010;

struct Node{
int exp;
double coe;
}a[maxn],b[maxn],ans[maxn];

int main(){
int len1,len2;
scanf("%d",&len1);
for(int i=0;i<len1;i++)
scanf("%d%lf",&a[i].exp,&a[i].coe);
scanf("%d",&len2);
for(int i=0;i<len2;i++)
scanf("%d%lf",&b[i].exp,&b[i].coe);

int p1,p2;int p;
for(p1=p2=0;p1<len1||p2<len2;){
if(a[p1].exp>b[p2].exp){
ans[p].exp=a[p1].exp;
ans[p].coe=a[p1].coe;
p++;p1++;
}
else if(a[p1].exp<b[p2].exp){
ans[p].exp=b[p2].exp;
ans[p].coe=b[p2].coe;
p++;p2++;
}
else{
ans[p].exp=a[p1].exp;
ans[p].coe=a[p1].coe+b[p2].coe;
p++;p1++;p2++;
}
}
int cnt=0;
for(int i=0;i<p;i++) if(ans[i].coe) cnt++;
printf("%d",cnt);
for(int i=0;i<p;i++){
if(ans[i].coe) printf(" %d %.1f",ans[i].exp,ans[i].coe);
}
}

//其实可以直接用 a[expo]= coe 来存储,然后直接相加coe,再统计非零系数cnt个数并按要求输出;
//[解法2]
#include<cstdio>
const int maxn=1010;
double ans[maxn]={0};
int main(){
int k;int exp;double coe;
scanf("%d",&k);
for(int i=0;i<k;i++){
scanf("%d%lf",&exp,&coe);
ans[exp]=coe;
}
scanf("%d",&k);
for(int i=0;i<k;i++){
scanf("%d%lf",&exp,&coe);
ans[exp]+=coe;
}
int cnt=0;
for(int i=0;i<maxn;i++){
if(ans[i]) cnt++;
}
printf("%d",cnt);
for(int i=maxn-1;i>=0;i--){
if(ans[i]) printf(" %d %.1f",i,ans[i]);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c语言 算法入门