[洛谷U62358]求导函数

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 \]

而对于第二个问题,则需要注意很多特殊情况。

  1. \(a=0\),则跳过这一项
  2. 除了第一项,\(a>0\)时前面要有+号
  3. 除了最后一项,\(a=1/-1\)分别只能输出+和-
  4. 最后一项的\(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;   //除了最后一项以外的
    }
} 

数据

posted @ 2019-02-19 13:35  water_lift  阅读(282)  评论(0编辑  收藏  举报