PAT 乙级 1010 一元多项式求导(解题思路+AC代码)
题目:
设计函数求一元多项式的导数。(注:xn(n为整数)的一阶导数为nxn−1。)
输入格式:
以指数递降方式输入多项式非零项系数和指数(绝对值均为不超过 1000 的整数)。数字间以空格分隔。
输出格式:
以与输入相同的格式输出导数多项式非零项的系数和指数。数字间以空格分隔,但结尾不能有多余空格。注意“零多项式”的指数和系数都是 0,但是表示为 0 0
。
输入样例:
3 4 -5 2 6 1 -2 0
输出样例:
12 3 -10 1 6 0
代码长度限制 16 KB
时间限制 400 ms
内存限制 64 MB
解题思路
这道题看起来很复杂其实很简单,但这都要基于一个前提就是你知道scanf的返回值。
scanf返回值:如果成功,该函数返回成功匹配和赋值的个数。如果到达文件末尾或发生读错误,则返回 EOF。
我们知道当scanf到达文件末尾时,返回EOF那么我们只需要用一个循环遍历整个多项式,在一轮循环中我们需要用两个遍历来接收多项式其中一项的系数和指数,并且打印输出该项求导后的系数和指数。当遇到它的指数为0时,就不打印,因为常数的导数是0。
注意: 这里题目中要求还要考虑0多项式,也就是输入为"n 0"
(n为非0整数),输出要为"0 0"
,那就是不打印的情况就要输出"0 0"
。这里我们可以设置一个flag,初始值为1,只要打印了的,就设置为0,整个循环下来后,如果flag的值还是为1(表明没有打印输出),则打印输出"0 0"
。
AC代码
#include <cstdio>int main()
{int m = 0;int n = 0;int flag = 1;while (scanf("%d %d", &m, &n) != EOF){if (n != 0){if (1 == flag)//如果是第一次打印{printf("%d %d", m * n , n - 1);flag = 0;}else//如果不是第一次打印则需要在之前打印一个空格{printf(" %d %d", m * n, n - 1);}}}if (1 == flag)//判断是否之前有过打印,如果没有打印,则输出"0 0"{printf("0 0");}return 0;
}