U62358 求导函数
题面
给出一个n次函数(f(x)=a_{n}x^{n}+a_{n-1}x^{n-1}+...+a_{1}x+a_0)的各项系数(a_n,a_{n-1}...a_1,a_0)
请计算它的导函数。
格式
输入包括两行。
第一行包括一个整数(n)。
第二行n+1个整数(a_n,a_{n-1}...a_1,a_0)
输出包括一行,即所求的导函数。具体格式见样例。
样例#1
输入
2
2 0 1
输出
f(x)=4x
样例#2
输入
7
3 8 0 2 1 7 4 4
输出
f(x)=21x^6+48x^5+8x^3+3x^2+14x+4
数据限制
规模 | n |
---|---|
50% | ([1,20]) |
50% | ([1,10000]) |
规模 | (a_i) |
---|---|
20% | (0) |
80% | ([-49,50]) |
分析
这个题目中需要解决的问题有两个:
- 如何求导函数
- 如何输出
对于第一个问题,有题意可知f(x)一定是一个整式函数,所以有如下公式成立:
[f'(x)={n}a_{n}x^{n-1}+(n-1)a_{n-1}x^{n-2}+...+a_1
]
而对于第二个问题,则需要注意很多特殊情况。
- 若(a=0),则跳过这一项
- 除了第一项,(a>0)时前面要有+号
- 除了最后一项,(a=1/-1)分别只能输出+和-
- 最后一项的(x^0)不能输出,倒数第二项的(x^1)只能输出(x)
解法
#include<bits/stdc++.h>
using namespace std;
int n,a;
int main(){
cin>>n;
cout<<"f(x)=";
for(int i=n;i>=0;i--){
cin>>a;
if(i==0)break; //只有n项
if(a==0)continue; //系数为0不输出
a*=i; //转换为导函数
if(a<0){ //负数时
if(i==1)cout<<a; //最后一项必须完整输出
else if(a==-1)cout<<'-'; //-1时只输出-号
else cout<<a;
}else{ //正数时
if(i!=n)cout<<'+'; //除了第一项都要有+号
if(a!=1||i==1)cout<<a; //系数不为一或最后一项时都要完整输出
}
if(i==2)cout<<'x'; //倒数第二项
else if(i!=1)cout<<"x^"<<i-1; //除了最后一项以外的
}
}