#P1467. Symbolic Derivation

    ID: 468 传统题 1000ms 256MiB 尝试: 8 已通过: 1 难度: 10 上传者: 标签>组合数学数据结构字符串Southeastern Europe 2000

Symbolic Derivation

题目描述

编写一个程序,对给定的函数 f(x)f(x) 进行符号求导,即计算 f(x)=df(x)dxf'(x) = \frac{df(x)}{dx}。函数 f(x)f(x) 由表达式定义,可能包含以下运算:

  • 加法++
  • 减法-
  • 乘法*
  • 除法//
  • 自然对数ln\ln

操作数可以是变量 xx 或数值常数。表达式可以包含任意嵌套的子表达式(用括号 ()() 表示),并以常见的中缀形式给出,例如:

$$\frac{(2*\ln(x+1.7)-x*x)}{(-7)+3.2*x*x} + (x+3*x)*x $$

输入规则

  1. 数值常数的格式为 ±d.d\pm d.d(可选符号,整数和小数部分位数不限),如 45.78-45.78
  2. 输入表达式保证语法正确(无错误)。
  3. 每行一个 f(x)f(x) 的表达式,无空格。

输出规则

  1. 输出导数表达式,保持中缀形式,不进行任何化简(如 0x0*x1x1*x0+x0+x 等需保留)。
  2. 严格按以下求导规则添加括号:
    • (a+b)=a+b(a + b)' = a' + b'
    • (ab)=ab(a - b)' = a' - b'
    • (ab)=(ab+ab)(a * b)' = (a' * b + a * b')
    • (a/b)=ababb2(a / b)' = \frac{a' * b - a * b'}{b^2}(输出时用 b2b^2 而非 (bb)(b*b)
    • (ln(a))=aa(\ln(a))' = \frac{a'}{a}
    • x=1x' = 1
    • 常数导数为 00

运算符优先级与结合性

  1. 乘除(*//)优先级高于加减(++-),括号可改变优先级。
  2. 所有运算符均为左结合:
    • abc=(ab)ca*b*c = (a*b)*c
    • a/b/c=(a/b)/ca/b/c = (a/b)/c
    • a/bc=(a/b)ca/b*c = (a/b)*c

输入输出示例

输入样例 1

x*x/x  
-45.78*x+x  
-2.45*x*x+ln(x-3)  

输出样例 1

((1*x+x*1)*x-x*x*1)/x^2  
(0*x-45.78*1)+1  
((0*x-2.45*1)*x-2.45*x*1)+(1-0)/(x-3)  

样例解释

  1. xxx\frac{x*x}{x} 求导,按除法规则展开并保留冗余项。
  2. 45.78x+x-45.78*x + x 求导,分别处理常数乘法和加法。
  3. 2.45x2+ln(x3)-2.45*x^2 + \ln(x-3) 求导,依次应用乘法、对数和减法规则。

题目来源

Southeastern Europe 2000

注:本题需实现符号求导的解析与展开,重点在于严格按规则添加括号不化简表达式