求解释,一个自己写的算式计算,出现bug,在函数添加一个cout,bug又没了
  • 板块灌水区
  • 楼主CATZZK
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/8/21 20:36
  • 上次更新2024/8/21 23:42:28
查看原帖
求解释,一个自己写的算式计算,出现bug,在函数添加一个cout,bug又没了
1138801
CATZZK楼主2024/8/21 20:36

这里是代码,现在测试[3+6*(1+8)]/10这个例子是11.7,但把14行cout注释后,代码就输出5.7了。

#include<bits/stdc++.h>
using namespace std;
struct Node{string str;int Level[1005];} e;
double str_to_num(string str){
	double num,w=1;bool flag=false;
	for(auto c:str){
		if(c=='.') flag=true;
		else if(flag==true) w/=10,num+=w*(c-'0');
		else num=num*10+c-'0';
	}
	return num;
}
double dfs(Node formula){
	//cout<<"";
	int min_id=0;bool flag=false;
	for(int i=0;i<formula.str.length();i++){
		if(formula.Level[i]!=100){
			flag=true;
			if(formula.Level[i]<formula.Level[min_id]) min_id=i;
		}
	}
	if(!flag) return str_to_num(formula.str);
	Node sub1,sub2;
	sub1.str=formula.str.substr(0,min_id);
	sub2.str=formula.str.substr(min_id+1,formula.str.length()-min_id-1);
	for(int i=0;i<min_id;i++)
		sub1.Level[i]=formula.Level[i];
	for(int i=min_id+1,j=0;i<formula.str.length();i++,j++){
		sub2.Level[j]=formula.Level[i];
	}
	switch(formula.str[min_id]){
		case('+'): return dfs(sub1)+dfs(sub2);
		case('-'): return dfs(sub1)-dfs(sub2);
		case('*'): return dfs(sub1)*dfs(sub2);
		case('/'): return dfs(sub1)/dfs(sub2);
	}
}
int main(){
	string str;cin>>str;
	int flag=0;
	for(int i=0;i<str.length();i++){
		if(str[i]=='('||str[i]=='['||str[i]=='{') flag+=2;
		else if(str[i]==')'||str[i]==']'||str[i]=='}') flag-=2;
		else if(str[i]=='+'||str[i]=='-'){
			e.Level[e.str.length()]=0+flag;
			e.str.insert(e.str.length(),1,str[i]);
		}
		else if(str[i]=='*'||str[i]=='/'){
			e.Level[e.str.length()]=1+flag;
			e.str.insert(e.str.length(),1,str[i]);
		}
		else{
			e.Level[e.str.length()]=100;
			e.str.insert(e.str.length(),1,str[i]);
		}
	}
	printf("%.6f",dfs(e));
	return 0;
}

并且把16行判断条件更改成这样后,代码又神奇的运行正确了。

#include<bits/stdc++.h>
using namespace std;
struct Node{string str;int Level[1005];} e;
double str_to_num(string str){
	double num,w=1;bool flag=false;
	for(auto c:str){
		if(c=='.') flag=true;
		else if(flag==true) w/=10,num+=w*(c-'0');
		else num=num*10+c-'0';
	}
	return num;
}
double dfs(Node formula){
	int min_id=0;bool flag=false;
	for(int i=0;i<formula.str.length();i++){
		if(formula.str[i]=='+'||formula.str[i]=='-'||formula.str[i]=='*'||formula.str[i]=='/'){
			flag=true;
			if(formula.Level[i]<formula.Level[min_id]) min_id=i;
		}
	}
	if(!flag) return str_to_num(formula.str);
	Node sub1,sub2;
	sub1.str=formula.str.substr(0,min_id);
	sub2.str=formula.str.substr(min_id+1,formula.str.length()-min_id-1);
	for(int i=0;i<min_id;i++)
		sub1.Level[i]=formula.Level[i];
	for(int i=min_id+1,j=0;i<formula.str.length();i++,j++){
		sub2.Level[j]=formula.Level[i];
	}
	switch(formula.str[min_id]){
		case('+'): return dfs(sub1)+dfs(sub2);
		case('-'): return dfs(sub1)-dfs(sub2);
		case('*'): return dfs(sub1)*dfs(sub2);
		case('/'): return dfs(sub1)/dfs(sub2);
	}
}
int main(){
	string str;cin>>str;
	int flag=0;
	for(int i=0;i<str.length();i++){
		if(str[i]=='('||str[i]=='['||str[i]=='{') flag+=2;
		else if(str[i]==')'||str[i]==']'||str[i]=='}') flag-=2;
		else if(str[i]=='+'||str[i]=='-'){
			e.Level[e.str.length()]=0+flag;
			e.str.insert(e.str.length(),1,str[i]);
		}
		else if(str[i]=='*'||str[i]=='/'){
			e.Level[e.str.length()]=1+flag;
			e.str.insert(e.str.length(),1,str[i]);
		}
		else{
			e.Level[e.str.length()]=100;
			e.str.insert(e.str.length(),1,str[i]);
		}
	}
	printf("%.6f",dfs(e));
	return 0;
}

2024/8/21 20:36
加载中...