PTA(链表)2-1 一元多项式求导

2-1 一元多项式求导

分数 5

作者 DS课程组

单位 浙江大学

设计函数求一元多项式的导数。

输入格式:

以指数递降方式输入多项式非零项系数和指数(绝对值均为不超过1000的整数)。数字间以空格分隔。
注意:零多项式用 0 0 表示。

输出格式:

以与输入相同的格式输出导数多项式非零项的系数和指数。数字间以空格分隔,但结尾不能有多余空格。

输入样例:

1
3 4 -5 2 6 1 -2 0

输出样例:

1
12 3 -10 1 6 0

答案

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
#include <iostream>
using namespace std;

// 定义链表结构
typedef struct LNode {
int coeff;
int exp;
struct LNode *next;
} LNode, *LinkList;

// 初始化链表
void initList(LinkList &L) {
L = new LNode; // 使头指针指向头结点
L->next = NULL;
}

// 尾插法插入链表
void insertAtTail(LinkList &tail, int coeff, int exp) {
LNode *newNode = new LNode;
newNode->coeff = coeff;
newNode->exp = exp;
newNode->next = NULL;
tail->next = newNode;
tail = newNode;
}

// 给链表求导
void differentiate(LinkList &L) {
LinkList p = L->next; // 用于遍历链表的指针
while (p != NULL) {
if (p->exp == 0) { // 处理常数项
p->coeff = 0;
return;
}
p->coeff = p->coeff * p->exp;
p->exp = p->exp - 1;
p = p->next;
}
}

// 打印链表
void printList(LinkList L) {
LinkList p = L->next; // 从第一个结点开始
bool isFirst = true;
if (p->coeff == 0) { // 处理零多项式
cout << "0 0";
}
while (p != NULL) { // 表为空或者系数为0时不打印了
if (p->coeff == 0) {
break;
}
if (!isFirst) {
cout << " ";
}
cout << p->coeff << " " << p->exp;
p = p->next;
isFirst = false;
}
}

int main() {
LinkList L;
initList(L);
int coeff, exp; // coeff系数,exp指数
LNode *tail = L; // 定义一个尾指针,方便每次插入到链表尾部

while (cin >> coeff >> exp) {
insertAtTail(tail, coeff, exp);
}
// 求导
differentiate(L);
printList(L);
}

遇到的问题

1.如何知道停止读取

使用 cin 流状态判断

循环读取系数(coeff)和指数(exp),当 cin >> coeff >> exp 返回 false 时停止(即输入流中无更多有效整数,或遇到换行、EOF 等结束符)。

示例代码片段:

1
2
3
4
int coeff, exp;
while (cin >> coeff >> exp) { // 读取成功则继续,失败则终止循环
// 处理当前项的求导逻辑
}

2.pta上是完全正确,不知道为啥我的编译器不输出

(在您本地运行时) 确保输入数据后按 $\text{EOF}$ 键($\text{Ctrl}+\text{D}$ 或 $\text{Ctrl}+\text{Z}$)以退出输入循环