PAT乙级的题目相对于甲级的题目较为简单,但是有时候也会有一两道题很奇怪,具有一定的逻辑难度,这道题就是一个例子。
先看一下题目:
010 一元多项式求导 (25 分)
设计函数求一元多项式的导数。(注:x
n
(n为整数)的一阶导数为nx
n−1
。)
输入格式:
以指数递降方式输入多项式非零项系数和指数(绝对值均为不超过 1000 的整数)。数字间以空格分隔。
输出格式:
以与输入相同的格式输出导数多项式非零项的系数和指数。数字间以空格分隔,但结尾不能有多余空格。注意“零多项式”的指数和系数都是 0,但是表示为 0 0。
样例就不放了。简单的来说这是一个求导的问题,但是这不完全是一个求导的问题。
因为题目定义了一个叫做0 0的东西,查看数学定义可知道,0的0次方是不被定义的,但是在题目里,0 0表示零多项式,意思就是假如求导后的结果为0.就必须要输出0 0。反之,如果有其它的非零项的存在它就不会输出,因此在只输入一项的情况下,应当判断是不是0 0,然后输出,0 0的情况有两种,一种是输入本身就是0 0,另一种是求导后为0 0.
其他情况的普通数字,只要判断系数项是不是0,就可以判断是否输出了。
同样求导的过程也会被改变,因为任意系数的0次方都是0,所以此时求导,指数是不可以减去1的,这会造成输出错误。
#include <iostream> #include <algorithm> using namespace std; int main(int argc, char** argv) { char c; int mn[1000]; cin>>mn[0]>>mn[1]; if (mn[0]==0&&mn[1]==0) { cout<<'0'<<' '<<'0'; return 0; } int n=2; while(getchar()!='\n') { cin>>mn[n]; n++; // cout<<mn[n]<<endl; } // cout<<n; for (int i=0;i<n;i=i+2) { if(mn[i+1]==0) mn[i]=0; else { mn[i]*=mn[i+1]; mn[i+1]--; //求导算法处理 } } int ff=0; for (int i=0;i<n;i=i+2) { if (ff==0) //第一项输出 { if(mn[i]!=0) //系数不为0,则必然输出 { cout<<mn[i]<<' '<<mn[i+1]; ff=1; } if(mn[i]==0&&mn[i+1]==0&&n==2) //只有一项,且为0 0,则输出 { cout<<mn[i]<<' '<<mn[i+1]; ff=1; } } else //非第一项输出 { if(mn[i]!=0) //系数不为0,则必然输出 cout<<' '<<mn[i]<<' '<<mn[i+1]; } } // cout<<n; return 0; }