CCF二十四点巧解(100)c/c++
程序思想:1+3x2/8 检测乘号和除号,因为乘除肯定是优先计算,可以将数组拆分成1+0+6/8;这样对顺序检测也加强了方便
也就是将a[i+1]就变为a[i]*a[i+1],a[i]变成0,b[i]变成’+’,当b[i-1]为负号时,需要注意一下,例如1-3x2/8拆分成
1-(0+6)/8 去括号 这就当做1-0-6/8,所以b[i]=’-'这样就解决了问题
特别是只需要一次遍历就可以把乘法和除法检测出来,时间复杂度极小,效率很高
注意事项,因为题目要求是两个整数相除等于整数,
开始是将所有数变成浮点数来计算的,导致只有70分,后面将所有数据改为整型数组就100,又是细节问题
#include<stdio.h>
#include<malloc.h>
int main(){
int n;
scanf("%d",&n);//输入的次数
int*c=(int*)calloc(n,sizeof(int));//此数组用来记录yes或者No, 1表示yes,0表示No
int m=n;
while(n>0){
int a[4]={0};
char b[4];
scanf("%d%c%d%c%d%c%d",&a[0],&b[0],&a[1],&b[1],&a[2],&b[2],&a[3]);
for(int i=0;i<3;i++){
if(b[i]=='x'){
a[i+1]=a[i]*a[i+1];//发现乘法了将后面的那个数变成乘积的数值
a[i]=0;//当前的数值必须变为0
if(i>0&&b[i-1]=='-')//如果前面有符号为-那么相应的自己也要变成负号
b[i]='-';
else b[i]='+'; //其他情况都可以为+
//printf("%d%c%d%c%d%c%d\n",a[0],b[0],a[1],b[1],a[2],b[2],a[3]);
}
else if(b[i]=='/'){
a[i+1]=a[i]/a[i+1];
a[i]=0;
if(i>0&&b[i-1]=='-')
b[i]='-';
else b[i]='+';
//printf("%d%c%d%c%d%c%d\n",a[0],b[0],a[1],b[1],a[2],b[2],a[3]);
}
}
int sum=a[0];
for(int i=0;i<3;i++){//现在剩下的三个符号全变成加或者减,可以没有优先顺序直接计算
if(b[i]=='+'){
sum=sum+a[i+1];
}
if(b[i]=='-'){
sum=sum-a[i+1];
}
}
if(sum==24){
c[n-1]=1;//值为24点,所以为yes
}
n--;
}
for(int i=m-1;i>=0;i--){
if(c[i]==1)
printf("Yes\n");
else
printf("No\n");
}
}