我已经在路上了

题目链接                                                                      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();
		}
	}
}

猜你喜欢

转载自blog.csdn.net/dadaguai001/article/details/81195224
今日推荐