✅ PAT 乙级题目讲解:1010《一元多项式求导》
摘要:本文详细讲解 PAT 乙级 1010 题《一元多项式求导》的完整解法。核心考查一元多项式求导规则的程序实现,重点包括:逐对读取系数与指数、跳过常数项(导数为 0)、特判零多项式输出
0 0、以及末尾无多余空格的格式化输出。文章从题目解析、样例推导、分步解题思路到完整 C++ 代码逐步展开,并总结常见错误与时间/空间复杂度分析,帮助读者扎实掌握表达式建模与边界处理技巧。
🧩 题目简介
本题考查的是一元多项式求导法则的程序实现。给出一个按“系数 指数”顺序输入的多项式表示,需输出它的一阶导数形式。
导数计算规则:
若某一项为axba x^baxb,则其一阶导数为abxb−1a b x^{b-1}abxb−1。
但需注意:
- 常数项(指数为 0)导数为 0,应忽略;
- 若导数结果为空(即输入为常数多项式),则应输出
0 0; - 输出为“系数 指数”格式,项之间用空格分隔,末尾不得多空格。
🧪 样例分析
输入:
3 4 -5 2 6 1 -2 0输入多项式为:
3x4−5x2+6x−2 3x^4 - 5x^2 + 6x - 23x4−5x2+6x−2
逐项求导:
- 3x4⇒12x33x^4 \Rightarrow 12x^33x4⇒12x3
- −5x2⇒−10x-5x^2 \Rightarrow -10x−5x2⇒−10x
- 6x⇒66x \Rightarrow 66x⇒6
- −2-2−2为常数项,其导数为 0,忽略
输出为:
12 3 -10 1 6 0🔍 解题思路
📎 变量说明
| 变量名 | 含义 |
|---|---|
a | 当前项的系数 |
b | 当前项的指数 |
c[] | 存放导数结果的数组(系数与指数交替存放) |
k | 当前存入c[]的索引指针 |
f | 标记是否至少存在一个有效导数项,用于特判零多项式 |
✅ Step 1:逐对读取多项式项
通过while(cin >> a >> b)实现成对读取输入。
while(cin>>a>>b){...}✅ Step 2:跳过常数项
若指数为 0,该项为常数,导数为 0,应跳过。
if(!b)continue;✅ Step 3:计算导数并存入数组
按导数法则求导并存入数组中备用。
c[++k]=a*b;// 新系数c[++k]=b-1;// 新指数f=1;// 标记至少存在一项✅ Step 4:特判零多项式
若f == 0,即没有一项导数有效,应直接输出:
0 0✅ Step 5:格式化输出结果
遍历c[],注意末尾无多余空格。
for(inti=1;i<=k;i++){cout<<c[i]<<(i<k?" ":"");}✅ 完整代码
#include<bits/stdc++.h>usingnamespacestd;inta,b,c[2050],k;intmain(){boolf=0;while(cin>>a>>b){if(!b)continue;// 跳过常数项计算c[++k]=a*b;// 导数项的系数c[++k]=b-1;// 导数项的指数f=1;}if(!f)cout<<"0 0";for(inti=1;i<=k;i++){cout<<c[i]<<(i<k?" ":"");}return0;}🚧 常见错误提醒
| 错误类型 | 具体表现 |
|---|---|
| 忘记跳过常数项 | 指数为 0 的项仍被处理,导致错误 |
| 输出格式错误 | 多输出空格或结尾处空格 |
| 忽略“零多项式”特判 | 所有项为常数时未输出0 0 |
✅ 总结归纳
- 熟悉一元多项式导数规则;
- 注意特殊情况处理(常数项、零多项式);
- 精确控制输出格式;
- 简单数组模拟处理足矣,无需复杂结构。
📊 时间复杂度
时间复杂度:O(n)O(n)O(n)
每项读取和处理一次,线性复杂度。空间复杂度:O(n)O(n)O(n)
使用一维数组记录导数结果,空间线性增长。
🧠 思维拓展
- 若输入项很多,考虑链表/向量优化;
- 多项式乘法、积分等操作也可参考类似结构;
- 本题是表达式建模与结构化存储的启蒙案例之一。
💡 本题虽然是基础题,但细节众多,需要精细操作与完整逻辑链。能正确写出并通过所有测试点,说明你对表达式建模和边界处理已初步掌握!