CCF二十四点巧解(100)

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");
		}
		 
		
	}

猜你喜欢

转载自blog.csdn.net/qq_40699600/article/details/108447809