PTA甲级刷题1002 A+B for Polynomials(代码版+多种思路)

PAT甲级刷题笔记(C++)

Hello!朋友们俺也来写博客啦~
最近在开始刷PAT的甲级真题,欢迎大噶一起来讨论还有互相监督刷题吖~后面也会陆续更新更多题目的刷题思路和完整代码!让我们冲冲冲吖!
在这里插入图片描述

  • 写在前面:既然赶路,那便认真赶路

1002 A+B for Polynomials(多项式合并及排序)

(1)题目

  • 英语原题
    在这里插入图片描述

(2)代码和注释

  • 实现方式①【部分正确】
  • 优点:无需提前分配多余的存储空间
  • 缺点:代码量长
#include<iostream>
#include<cstdio>
#include<cmath>
#include<vector>
#include <algorithm>
using namespace std;

int k1, k2, j=0, i=1, result_count=0, flag;
float tmp_float;
vector<int> num1;
vector<float> num2;

vector<int> result1;
vector<float> result2;

void bubble(vector<int>& result1, vector<float>& result2, int result_count)
{
    for(int pass=1; pass<result_count; pass++)
    {
        flag=1;
        for(i=0;i<result_count-pass;i++)
        {
            if(result1[i]<result1[i+1])
            {
                j=result1[i];
                result1[i]=result1[i+1];
                result1[i+1]=j;
                
                tmp_float=result2[i];
                result2[i]=result2[i+1];
                result2[i+1]=tmp_float;
                flag=0;
            }
        }
        if(flag) break;
    }
}

int main()
{
    cin>>k1;
    while(cin>>tmp_float)
    {
        if(i || j==2*k1)
        {
            if(j==2*k1) 
            {
                k2=tmp_float;
                i=1;
            }
            else
            {
                num1.push_back(tmp_float);
                i=0;
            }
        }
        else
        {
            num2.push_back(tmp_float);
            i=1;
        }
        j++;
    }
    
    for(i=0;i<k1;i++)
    {
        flag=1;
        for(j=0;j<k2;j++)
        {
            if(num1[i]==num1[k1+j])
            {
                result1.push_back(num1[i]);
                result2.push_back(num2[i]+num2[k1+j]);
                result_count++;
                flag=0;
                break;
            }
        }
        if(flag)
        {
            result1.push_back(num1[i]);
            result2.push_back(num2[i]);
            result_count++;
        }
    }
    flag=0;
    for(j=0;j<k2;j++)
    {
        for(i=0;i<result_count;i++)
        {
            if(num1[k1+j]!=result1[i])
            {
                flag++;
                continue;
            }
        }
        if(flag==result_count)
        {
            result1.push_back(num1[k1+j]);
            result2.push_back(num2[k1+j]);
            result_count++;
        }
    }
    
    flag=1;
    
    bubble(result1,result2,result_count);
    
    cout << result_count;
    for(i=0;i<result_count;i++)
    {
        cout <<' '<< result1[i] <<' '<< result2[i];
    }

// debug信息显示    (vector对未赋值的区域在显示时会自动置0)
//     vector<int>::iterator it;
//     for (it=num1.begin();it!=num1.end();it++)
//         cout<<*it<<endl;
    

//     for (i=0;i<4;i++)
//         cout<<num2[i]<<endl;
//     for (i=0;i<4;i++)
//         cout<<num1[i]<<endl;
// debug信息显示    (vector对未赋值的区域在显示时会自动置0)
    
    return 0;
}

  • 实现方式②【全部正确】
  • 优点:将指数作为位置信息,系数作为数组对应位置的值,则多项式合并变为对应位置数值相加
  • 缺点:需要初始化一个很大空间的数组,因为指数的范围为(0,1000)
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
const int maxn = 1e3+100;
int n, cnt, id;
float a[maxn], val;
int main(){
    for(int i = 1; i <= 2; i++){
        scanf("%d", &n);
        for(int j = 1; j <= n; j++){
            scanf("%d%f", &id, &val);
            //if(a[id]==0) cnt++;
            a[id] += val;
        }
    }
    for(int i = 0; i < maxn; i++)
        if(a[i]!=0) cnt++;
    printf("%d", cnt);
    for(int i = 1000; i >= 0; i--){
        if(a[i]!=0) printf(" %d %.1f", i, a[i]);
    }
} 

(3)参考的其他大哥的链接

知乎高赞回答——PAT甲级刷题笔记

  • 写在后面:关关难过,关关过~
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值