Directorio artículo
título
Ideas de resolución de problemas
Hacer primero la multiplicación y la división, suma y la resta de tareas.
Como 3 + 4x5 + 3, se puede convertir primero a la 3 + 3 + 20, hacer sumador.
El algoritmo es: el uso de funciones recursivas, multiplicación y división encuentro, primero calculados, y luego volver a añadir o restar. + El símbolo puede ser utilizado como el delimitador para dividir. Es de notar que el primer carácter inicial se trata previamente, como se pondrá de 3-4 3 + (- 4), en el que los caracteres originales son 4 '4', y que necesitan ser cambiados a '0' - ( '4' - '0' caracteres) de este valor, a fin de lograr una división unificada por +.
! ! ! Un pozo: 3x5 / 6x4 debe ser de 8, debido a que (aunque el tema no está muy claro) que deben cumplir, además de un número de '/' divisible necesario para completar la operación, en lugar del equivalente costumbre 3x5x4 / 6 reciben 10.
código
#include<stdio.h>
#include<string.h>
char sr[7];
int do_op(int r,int l){
if(r==l)//只剩下一个数
return sr[r]-'0';
else if(r+2==l){//只剩下一次运算
if(sr[r+1]=='+') return sr[r]-'0'+sr[l]-'0';
else if(sr[r+1]=='x') return (sr[r]-'0')*(sr[l]-'0');
else return (sr[r]-'0')/(sr[l]-'0');
}
else{//剩下多次运算,根据'+'进行拆解
int res=sr[r]-'0';//取第一个数
int i=r+1;
int right=-1,left=-1;
while(i<l){
if(sr[i]=='+'){
if(left==-1)
left=i;
else{
right=i;
return do_op(r,left-1)+do_op(left+1,right-1)+do_op(right+1,l);
}
}
i+=2;
}
if(left==-1){//全是乘除
int out=sr[r]-'0';
for(int j=r+1;j<l;j+=2){
if(sr[j]=='x')
out*=sr[j+1]-'0';
else
out=out/(sr[j+1]-'0');
}
return (int)out;
}
else//只有一个+
return do_op(r,left-1)+do_op(left+1,l);
}
}
void pre_do(){//先做预处理,把-m的格式改为+(-m)
for(int i=1;i<7;i+=2)
if(sr[i]=='-'){
sr[i]='+';
sr[i+1]='0'-(sr[i+1]-'0');
}
}
int main(void){
int n;
scanf("%d",&n);
for(int i=0;i<n;i++){
scanf("%s",sr);
pre_do();
int out=do_op(0,6);
if(out==24)
printf("Yes\n",out);
else
printf("No\n",out);
}
return 0;
}
caso de prueba
10
9+3+4x3
5+4x5x5
7-9-9+8
5x6/5x4
3+5+7+9
1x1+9-9
1x9-5/9
8/5+6x9
6x7-3x6
6x4+4/5