当前位置: 首页 > news >正文

PAT 甲级题目讲解:1002《A+B for Polynomials》

✅ PAT 甲级题目讲解:1002《A+B for Polynomials》

🧩 题目简介

本题要求实现两个一元多项式 A(x)A(x)A(x)B(x)B(x)B(x) 的加法操作。

每个多项式使用若干个 指数-系数 对表示,最终输出它们之和(结果中的零系数项应省略)。


🧪 样例分析

输入样例:

2 1 2.4 0 3.2
2 2 1.5 1 0.5

表示两个多项式分别为:

  • A(x)=2.4x1+3.2A(x) = 2.4x^1 + 3.2A(x)=2.4x1+3.2
  • B(x)=1.5x2+0.5x1B(x) = 1.5x^2 + 0.5x^1B(x)=1.5x2+0.5x1

合并相同指数项后:

  • A(x)+B(x)=1.5x2+(2.4+0.5)x1+3.2=1.5x2+2.9x1+3.2A(x)+B(x) = 1.5x^2 + (2.4+0.5)x^1 + 3.2 = 1.5x^2 + 2.9x^1 + 3.2A(x)+B(x)=1.5x2+(2.4+0.5)x1+3.2=1.5x2+2.9x1+3.2

输出:

3 2 1.5 1 2.9 0 3.2

🔍 解题思路

本题是典型的“稀疏多项式合并”问题,需注意指数相同项的合并与零系数项的剔除。

使用一个长度为 1005 的数组 b[],以指数为下标、系数为值,来存储合并后的多项式。

📎 变量说明

变量名类型含义
kint当前读入的非零项个数
nint当前项的指数
adouble当前项的系数
b[]double[]存储每个指数对应的系数
maxnint当前出现的最大指数
cint合并后非零项的数量

✅ Step 1:输入并合并多项式项

封装一个 f() 函数用于处理每组多项式的输入:

  1. 读取 k指数-系数 对;
  2. 每次累加到数组 b[] 的对应下标上;
void f(){scanf("%d", &k); while(k--){scanf("%d %lf", &n, &a); // 读取 k 对 指数-系数maxn = max(n, maxn); // maxn 记录最大指数项值b[n] += a; // 指数为 n 的项系数加上 a}
}

调用两次 f() 函数分别读入 A(x)A(x)A(x)B(x)B(x)B(x)

f();  // 读 A
f();  // 读 B

✅ Step 2:统计非零项个数

遍历 b[0..maxn],判断是否为非零项(浮点数判断),统计项数 c

for(int i = 0; i <= maxn; i++){if(b[i]) c++;
}

✅ Step 3:按降幂输出结果

  1. 输出总项数 c
  2. 再从 maxn 降序到 0 输出所有非零项;
  3. 每项格式为 指数 系数,系数保留 1 位小数。
printf("%d", c);
for(int i = maxn; i >= 0; i--){if(b[i]){printf(" %d %.1lf", i, b[i]);}
}

✅ 完整代码

#include <bits/stdc++.h>
using namespace std;int k, n, maxn, c;
double a, b[1005];void f(){scanf("%d", &k);while(k--){scanf("%d %lf", &n, &a);maxn = max(n, maxn);b[n] += a;}
}int main(){f();f();for(int i = 0; i <= maxn; i++){if(b[i]) c++;}printf("%d", c);for(int i = maxn; i >= 0; i--){if(b[i]){printf(" %d %.1lf", i, b[i]);}}return 0;
}

🚧 常见错误提醒

错误类型具体表现
忽略合并同类项相同指数项未累加,导致重复项
浮点数精度丢失未保留一位小数或误差未处理
忘记剔除零系数项输出了系数为 0 的项
输出格式不规范多余空格、换行或小数位数错误

✅ 总结归纳

📌 核心方法总结

  • 使用数组下标作为指数;
  • 直接累加系数;
  • 排序输出 + 精度控制。

📋 技术要点回顾

  • 多项式的稀疏表示;
  • 浮点加法的误差控制;
  • 格式化输出技巧(保留小数、控制空格)。

📊 复杂度分析

  • 时间复杂度:O(n)\mathcal{O}(n)O(n)
  • 空间复杂度:O(1001)\mathcal{O}(1001)O(1001)

其中 nnn 为两多项式项数之和,最大指数不超过 1000。


🧠 思维拓展

  • 多项式乘法该如何实现?能否用 map 优化?
  • 若存在负指数或小数指数,该如何表示和合并?
  • 若输入项数 >105>10^5>105,该如何减少空间消耗?
http://www.dtcms.com/a/293694.html

相关文章:

  • 二分查找----2.搜索二维矩阵
  • (13)机器学习小白入门YOLOv:YOLOv8-cls中用TensorBoard实时监控指标
  • 深入浅出理解 Reactor:响应式编程的利器​
  • Github上传文件流程图
  • Docker 应用数据备份、迁移方案
  • Redis原理之分布式锁
  • 武德物业和浑元科技-《软件方法》第2章业务建模之愿景03
  • Oracle物化视图详解
  • 计算机网络第四章(4)——网络层《无分类编址CIDR、路由聚合》
  • ESP32-CAM实战:DIY基于OpenAI的AI视觉识别相机
  • 校园后勤服务平台小程序的设计与实现
  • Android埋点实现方案深度分析
  • 新手向:Idea的使用技巧
  • Android 架构演进:从 MVC 到 MVVM 的设计之道
  • SpringCloud seata全局事务
  • python在windows电脑找回WiFi密码
  • LinkedList的模拟实现+LinkedList和ArrayList的区别
  • 使用 Maven 的 `maven-assembly-plugin` 插件打包zip
  • UE5实现NPC头部朝向玩家功能
  • 旧手机部署轻量级服务器
  • HakcMyVM-Luz
  • 解构未来金融:深入剖析DeFi与去中心化交易所(DEX)的技术架构
  • ZooKeeper在Hadoop中的协同应用:从NameNode选主到分布式锁实现
  • CSS 基础
  • Web 服务器和Web 中间件
  • Apache POI 介绍与使用指南
  • 思路探索:当大型语言模型遇见数据分析的现实挑战
  • 利用中间件实现任务去重与分发精细化:股吧舆情数据采集与分析实战
  • 【NLP舆情分析】基于python微博舆情分析可视化系统(flask+pandas+echarts) 视频教程 - 主页-最近七天微博发布量实现
  • java设计模式 -【装饰器模式】