whenever

  • Home

  • Tags21

  • Categories6

  • Archives122

  • About

PAT乙级1010 || 一元多项式求导(详解,C/C++示例,测试点分析)

Posted on 2019-08-15 In PAT

一元多项式求导

题目描述

设计函数求一元多项式的导数。(注:$x^n$(n为整数)的一阶导数为 $n \cdot x^{n−1}$。)

输入格式

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

输出格式

以与输入相同的格式输出导数多项式非零项的系数和指数。数字间以空格分隔,但结尾不能有多余空格。注意“零多项式”的指数和系数都是 0,但是表示为 0 0。

输入样例

1
3 4 -5 2 6 1 -2 0

输出样例

1
12 3 -10 1 6 0

问题解决

解题思想

本题代码过程非常简单,关键点是要处理到所有的情况,可分为以下3种情况:

  • “零多项式”,求导后仍为“零多项式”,此时输出为:0 0
  • 非“零多项式”,求导后变为”零多项式“,此时输出为:0 0
  • 非“零多项式”,求导后不为”零多项式“,此时正常输出求导后的系数和指数,但不输出0 0
    对于前两种情况,可用以下条件来判定:
1
if((exp == 0)&&(flag == 0))

else后即为第三种情况,但注意输出格式控制。

知识拓展

我们知道,可以用如下方式来判断是否输入完毕(点击进入相关讲解):

1
2
3
while(scanf("%s",str[i]) != EOF){
//内部操作
}

这次介绍一种新的方式,如下:

1
2
3
while(~scanf("%s",str[i++])){
//内部操作
}

上面两种方式的效果是完全一样的,原理是什么呢?我们知道,scanf()读入失败时会返回-1,C语言用EOF来表示-1,因此也就有了上面第一种方式。而在机器内部-1的补码表示为全1,~是按位取反运算符,全1取反后变为全0,也就是说,当读入结束时,scanf()函数会返回机器补码为全1(也就是-1),经~取反后为全0,从而跳出循环。

代码示例(C)

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
#include <stdio.h>

int main()
{
int coe,exp,flag = 0;
while(~scanf("%d%d",&coe,&exp)){
//如果多项式的第一项的指数为0,求导后即为“零多项式”,则应输出0 0
//用flag == 0来识别第一项
if((exp == 0)&&(flag == 0)){
printf("%d %d",exp,exp);
break;
}
//如果第一项的指数不为0,则后面指数为0的项不必输出
else if(flag == 0){
if(exp != 0){
printf("%d %d",coe * exp,exp - 1);
flag = 1;
}
}
else{
if(exp != 0){
printf(" %d %d",coe * exp,exp - 1);
}
}
}
return 0;
}

题目来源:PAT乙级1010
作者:DS课程组
单位:浙江大学

稀罕作者
Mengzhao Wang WeChat Pay

WeChat Pay

Mengzhao Wang Alipay

Alipay

# C/C++ # PAT # 编程
PAT乙级1009 || 说反话(详解,C/C++示例,测试点分析)
PAT乙级1011 || A+B 和 C(详解,C/C++示例,测试点分析)
  • Table of Contents
  • Overview
Mengzhao Wang

Mengzhao Wang

Try? All the way !
122 posts
6 categories
21 tags
  1. 1. 一元多项式求导
    1. 1.1. 题目描述
    2. 1.2. 输入格式
    3. 1.3. 输出格式
    4. 1.4. 输入样例
    5. 1.5. 输出样例
    6. 1.6. 问题解决
      1. 1.6.1. 解题思想
      2. 1.6.2. 知识拓展
      3. 1.6.3. 代码示例(C)
© 2021 Mengzhao Wang