1 条题解

  • 0
    @ 2025-7-30 22:30:57

    理解

    struct Re2_str_dou{
    	string Str="";
    	double Dou=0;
    };
    struct Re2_int_int{
    	int Start=0;
    	int End=0;
    };
    Re2_int_int Bracket_found(string Sentence)
    {
    	Re2_int_int Ret;
    	int num=-1,a=0,b=0,total=0;//,copy=Sentence.size();
    	Ret.Start=Sentence.find('(');
    	Sentence.erase(Ret.Start,1);
    	while(!num){
    		//cout<<num<<endl;
    		a=Sentence.find('(');
    		b=Sentence.find(')');
    		if(a!=-1){//cout<<'a';
    			if(!num)break;
    			num--;
    			Sentence.erase(a,1);
    			total++;
    		}
    		if(b!=-1){//cout<<'b';
    			if(!num)break;
    			num++;
    			Sentence.erase(b,1);
    			total++;
    		}
    	}
    	Ret.End=b+total;
    	//cout<<"b="<<b<<endl;
    	return Ret;
    }
    Re2_str_dou Mon(string Monomial)
    {	Re2_str_dou Re;
    	//cout<<Monomial<<endl;
    	short Id=0;
    	if(Monomial[0]=='-')Id=-1;
    	else Id=1;
    	//cout<<Id;
    	if(Monomial[0]=='-' || Monomial[0]=='+')Monomial.erase(0,1);
    	while(
    		Monomial[0]>='0' && Monomial[0]<='9' || 
    		Monomial[0]=='.' || Monomial[0]=='x' || 
    		Monomial[0]=='*' || Monomial[0]=='p'){
    		//cout<<Monomial<<endl;
    		if(Monomial[0]>='0' && Monomial[0]<='9' || Monomial[0]=='.')
    		{
    			short Flag=0;
    			double Add=0;
    			while(Monomial[0]>='0' && Monomial[0]<='9' || Monomial[0]=='.')
    			{
    				if(Flag){
    					Add+=(double)(Monomial[0]-'0')/Flag;
    					Flag*=10;
    				}else{
    					Add*=10;
    					Add+=(double)(Monomial[0]-'0');
    				}
    				Monomial.erase(0,1);
    				if(Monomial[0]=='.'){
    					Flag=10;
    					Monomial.erase(0,1);
    				}
    			}
    			if(Re.Dou || Re.Dou)Re.Dou*=Add;
    			else if(!Re.Dou)Re.Dou=Add;
    		}
    		if(Monomial[0]=='*')Monomial.erase(0,1);
    		if(Monomial[0]=='x'){
    			if(Re.Dou && x)Re.Dou*=x;
    			else Re.Dou=x;
    			Monomial.erase(0,1);
    		}
    		if(Monomial[0]=='p' && Monomial[1]=='o' && Monomial[2]=='w' && Monomial[3]=='('){
    			//cout<<'a';
    			Monomial.erase(0,4);
    			double Base=0,Index=0,ad=0;
    			Re2_str_dou Re1;
    			Re1=Mon(Monomial);
    			Base=Re1.Dou;
    			Monomial=Re1.Str;
    			Monomial.erase(0,1);//cout<<Monomial;
    			Re1=Mon(Monomial);
    			Index=Re1.Dou;
    			Monomial=Re1.Str;
    			Monomial.erase(0,1);
    			//cout<<"B"<<Base<<"I"<<Index<<' ';
    			ad=pow(Base,Index);
    			if(Re.Dou && ad)Re.Dou*=ad;
    			else Re.Dou=ad;
    		}
    	}
    	Re.Str=Monomial;
    	Re.Dou*=Id;
    	//cout<<Re.Dou<<endl;
    	return Re;
    }
    double STR(string Monomial)
    {
    	Monomial.erase(0,2);
    	string Mo="";
    	double Sum=0;
    	short Id=1;
    	Re2_str_dou S;
    	while(Monomial!="")
    	{
    		//cout<<'a';
    		Mo="";
    		Id=1;
    		if(Monomial[0]=='-')Id=-1;
    		if(Monomial[0]=='+' || Monomial[0]=='-')Monomial.erase(0,1);
    		//cout<<Monomial<<endl;
    		while(
    		Monomial[0]>='0' && Monomial[0]<='9' || 
    		Monomial[0]=='.' || Monomial[0]=='x' || 
    		Monomial[0]=='x' || Monomial[0]=='p' ||
    		Monomial[0]=='o' || Monomial[0]=='w' ||
    		Monomial[0]=='(' || Monomial[0]==')' ||
    		Monomial[0]==',' || Monomial[0]=='*'   )
    		{
    			if(Monomial[0]=='p'){//cout<<'b';
    				Re2_int_int S1=Bracket_found(Monomial);
    				//cout<<"VCR"<<S1.Start<<' '<<S1.End<<endl;
    				for(int i=0;i<=S1.End;i++){
    					Mo+=Monomial[0];
    					Monomial.erase(0,1);
    				}
    			}else{
    				Mo+=Monomial[0];
    				Monomial.erase(0,1);
    			}
    		}
    		if(Id==-1)Mo='-'+Mo;
    		S=Mon(Mo);
    		//cout<<S.Dou<<endl;
    		Sum+=S.Dou;
    		//cout<<Monomial<<' '<<Mo<<' '<<S.Dou<<endl;
    	}
    	return Sum;
    }
    

    信息

    编号
    2373
    时间
    1000ms
    内存
    256MiB
    难度
    4
    标签
    递交数
    17
    已通过
    1
    上传者