思路:
每一段都可看成 +/- ax^b
正负号单独看
四种情况:
ax^b
ax
x
a
该项输出不输出就看a,b的值
只有a == 0 || b == 0 时不输出,其它情况下都输出
PS:数据卡int
代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=1e6+110;
char s[maxn];
int main()
{
scanf("%s",s+1);
int la=strlen(s+1);printf("f'(x)=");
int l=6;
if(s[l]!='-') s[5]='+',l--;
int f=0,shu=0,g=0,fx=0;
ll a=0,b=0;
for(int i=l;i<=la;i++)
{
if(s[i]=='+') f=1;
else if(s[i]=='-') f=0;
else
{
a=0,b=0,g=0,fx=0;
for(int j=i;j<=la;j++)
{
if(s[j]>='0'&&s[j]<='9')
{
if(fx==0)
{
g=1;//x的左边有值
a=a*10+s[j]-'0';
}
else
b=b*10+s[j]-'0';
}
else if(s[j]=='x'||s[j]=='^')
fx=1;
if(s[j+1]=='+'||s[j+1]=='-'||s[j+1]=='\0')
{
if(g==0) a=1;
if(b==0&&fx==1) b=1;//存在x,右边不存在
i=j;
break;
}
}
if(a==0||b==0);//肯定有输出
else
{
if(f==1)
{
if(shu==0);
else
printf("+");
}
if(f==0)
printf("-");
shu=1;
printf("%lld",a*b);
if(b==1) continue;
printf("x");
if(b>=3)
printf("^%lld",b-1);
}
}
}
if(shu==0) printf("0");
printf("\n");
return 0;
}
/*
f(x)=x^4-3x^2-x+1
f'(x)=4x^3-6x-1
f(x)=-1x^10+0x^6-3x^2+x-1
f'(x)=-10x^9-6x+1
f(x)=-x^10+0x^6-3x^2+x-1
f'(x)=-10x^9-6x+1
f(x)=1
f'(x)=0
f(x)=-1000x^1
f'(x)=-1000
*/