题目链接 C : 我已经在路上了
Progress Bar
时间限制:1 Sec 内存限制:256 MiB
提交:29 答案正确:6
题目描述
spring是不折不扣的学霸,那可是机房考研中的头号选手,不吹不黑,spring出征,寸草不生
但是这个学霸从来不屑于写简单的东西,因为时间是可贵的,spring喜欢留给B站小姐姐。所以在计算数学求导的时候spring就想出来用编程来完成,这样岂不是美滋滋,正好符合spring高大上的气质
那么问题来了,基础的求导公式那么多,spring只是添加了少许几个原函数,分别为y=C,y=x,y=x^n,y=sinx,y=cosx,y=lnx,y=loga(x),y=e^x,,每次对一个原函数求导,但是学霸spring又觉得这样太简单,所以就决定可以在求导函数中加上常数(正整数,int范围),当然为了平衡难度,常数只能够在x前面,或者函数最前面这两个地方添加(如果两者为同一地点只能添加一次)。
输入
输入形式严格按照上面的函数形式,并且符合常规数学知识,其中C,n,a都是正整数的形式给出,均在int范围。
输出
输出按照样例实现,(拒绝杠精,不接受反驳)不用带有y'=,直接写出求导的结果,占一行。
样例输入
复制
y=sin5x
y=e^2x
y=2log13(8x)
样例输出
复制
5cos5x
2e^2x
2/ln13/x
思路:先找规律再模拟,一定要思路清晰,分清楚情况,比如log和lin,规律就特别明显,如不管有没有前缀数字,后面都是1/x;
代码:
#include<iostream>
#include<cstdio>
using namespace std;
string str;
int i,size,flag,index;
long long int s,ss,t;
void x()//完成
{
if(s==0) cout<<1<<endl;
else cout<<s<<endl;
}
int xx()//完成
{
index=i+2;
for(int j=index;j<size;j++){
ss=ss*10+str[j]-'0';
}
if(s==0){
if(ss==1) cout<<1<<endl;//出现x^1
else{
cout<<ss<<"x^"<<ss-1<<endl;
}
}
else{
if(ss==1) cout<<s<<endl;
else{
cout<<s*ss<<"x^"<<ss-1<<endl;
}
}
}
void sin()//完成
{
index=i+3;
if(str[index]=='x'||(str[index]=='1'&&str[index+1]=='x')){//排除了sin1x和sinx
if(s==0||s==1) cout<<"cosx"<<endl;
else cout<<s<<"cosx"<<endl;
}
else{//剩下只有sin2x等
while(str[index]!='x'){
ss=ss*10+str[index]-'0';
index++;
}
if(s==0) cout<<ss<<"cos"<<ss<<"x"<<endl;
else cout<<ss*s<<"cos"<<ss<<"x"<<endl;
}
}
void cos()//完成
{
cout<<"-";
index=i+3;
if(str[index]=='x'||(str[index]=='1'&&str[index+1]=='x')){//排除了sin1x和sinx
if(s==0||s==1) cout<<"sinx"<<endl;
else cout<<s<<"sinx"<<endl;
}
else{//剩下只有sin2x等
while(str[index]!='x'){
ss=ss*10+str[index]-'0';
index++;
}
if(s==0) cout<<ss<<"sin"<<ss<<"x"<<endl;
else cout<<ss*s<<"sin"<<ss<<"x"<<endl;
}
}
void log()//完成
{
index=i+3;
while(str[index]!='('){
ss=ss*10+str[index]-'0';
index++;
}
if(s==0||s==1) cout<<1<<"/";
else cout<<s<<"/";
cout<<"ln"<<ss<<"/x"<<endl;
}
void ln()//完成
{
if(s==0||s==1) cout<<"1/x"<<endl;
else cout<<s<<"/x"<<endl;
}
void ex()//完成
{
index=i+2;
if(str[index]=='x'||(str[index]=='1'&&str[index+1]=='x')){//排除了e^1x和e^x的情况
if(s==0||s==1) cout<<"e^x"<<endl;
else cout<<s<<"e^x"<<endl;
}
else{//剩下的情况^都有正常的数字
while(str[index]!='x'){
ss=ss*10+str[index]-'0';
index++;
}
if(s==0||s==1) cout<<ss<<"e^"<<ss<<"x"<<endl;
else cout<<ss*s<<"e^"<<ss<<"x"<<endl;
}
}
int main()//由于代码的问题sin1000x进行了特判
{
while(cin>>str){
s=ss=0;
i=2,flag=1;
size=str.size();
if(str[i]>='0'&&str[i]<='9'){//获取前缀数字
while(str[i]>='0'&&str[i]<='9'&&size!=i){
s=s*10+str[i]-'0';
i++;
}
if(i==size) {//如果是常,则会跑到结尾
cout<<"0"<<endl;
flag=0;
}
}
//cout<<"s:"<<s<<endl;获取前缀数字是否成功
if(flag){//利用函数更有条理
if(str[i]=='x'&&i==size-1) x();
else if(str[i]=='x'&&str[i+1]=='^') xx();
else if(str[i]=='s') sin();
else if(str[i]=='c') cos();
else if(str[i]=='l'&&str[i+1]=='o') log();
else if(str[i]=='l') ln();
else ex();
}
}
}