✅ PAT 乙级题目讲解:1010《一元多项式求导》

摘要: 本文详细讲解 PAT 乙级 1010 题《一元多项式求导》的完整解法。核心考查一元多项式求导规则的程序实现,重点包括:逐对读取系数与指数、跳过常数项(导数为 0)、特判零多项式输出 0 0、以及末尾无多余空格的格式化输出。文章从题目解析、样例推导、分步解题思路到完整 C++ 代码逐步展开,并总结常见错误与时间/空间复杂度分析,帮助读者扎实掌握表达式建模与边界处理技巧。


🧩 题目简介

本题考查的是一元多项式求导法则的程序实现。给出一个按“系数 指数”顺序输入的多项式表示,需输出它的一阶导数形式。

导数计算规则:
若某一项为 axba x^baxb,则其一阶导数为 abxb−1a b x^{b-1}abxb1

但需注意:

  • 常数项(指数为 0)导数为 0,应忽略;
  • 若导数结果为空(即输入为常数多项式),则应输出 0 0
  • 输出为“系数 指数”格式,项之间用空格分隔,末尾不得多空格

🧪 样例分析

输入:

3 4 -5 2 6 1 -2 0

输入多项式为:
3x4−5x2+6x−2 3x^4 - 5x^2 + 6x - 2 3x45x2+6x2

逐项求导:

  • 3x4⇒12x33x^4 \Rightarrow 12x^33x412x3
  • −5x2⇒−10x-5x^2 \Rightarrow -10x5x210x
  • 6x⇒66x \Rightarrow 66x6
  • −2-22 为常数项,其导数为 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(int i = 1; i <= k; i++){
    cout << c[i] << (i < k ? " " : "");
}

✅ 完整代码

#include <bits/stdc++.h>
using namespace std;

int a, b, c[2050], k;
int main(){
    bool f = 0;
    while(cin >> a >> b){
        if(!b) continue; // 跳过常数项计算
        c[++k] = a * b; // 导数项的系数
        c[++k] = b - 1; // 导数项的指数
        f = 1;
    }
    if(!f) cout << "0 0";
    for(int i = 1; i <= k; i++){
        cout << c[i] << (i < k ? " " : "");
    }
    return 0;
}

🚧 常见错误提醒

错误类型具体表现
忘记跳过常数项指数为 0 的项仍被处理,导致错误
输出格式错误多输出空格或结尾处空格
忽略“零多项式”特判所有项为常数时未输出 0 0

✅ 总结归纳

  • 熟悉一元多项式导数规则;
  • 注意特殊情况处理(常数项、零多项式);
  • 精确控制输出格式;
  • 简单数组模拟处理足矣,无需复杂结构。

📊 时间复杂度

  • 时间复杂度: O(n)O(n)O(n)
    每项读取和处理一次,线性复杂度。

  • 空间复杂度: O(n)O(n)O(n)
    使用一维数组记录导数结果,空间线性增长。


🧠 思维拓展

  • 若输入项很多,考虑链表/向量优化;
  • 多项式乘法、积分等操作也可参考类似结构;
  • 本题是表达式建模与结构化存储的启蒙案例之一。

💡 本题虽然是基础题,但细节众多,需要精细操作与完整逻辑链。能正确写出并通过所有测试点,说明你对表达式建模和边界处理已初步掌握!

更多推荐