1002. A+B for Polynomials (25)

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]);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值