CCF CSP 2019-3-2 二十四点 C语言100分

CCF CSP 2019-3-2 二十四点 C语言100分

二十四点 完成时间11-22 17:19 代码长度1.034KB C 正确 100分 耗时0ms 代码长度2.527MB

一口气一次完成,一次通过100分,有点开心!!

思路:
先算乘除,把得到的结果赋给第二个数字,且第一个数字赋值为6562(因为999*9=6561,所以6562是不会出现的结果,只要大于6561就可以)例:3x4----->6562x12,做运算的时候只要判断下一个数有没有被使用过,如果使用过就跳过,直到找到第一个没有被用过的数,在进行计算就可以。
我把数字和运算符分开存储,数字num[0],num[1],num[2],num[3],运算符s[0],s[1],s[2],如果不看优先级排序就是这样num[0],s[0],num[1],s[1],num[2],s[2],num[3],也就是乘除运算的第一个数字一定和他们的位置相同。如s[0],num[0] s[2],num[2],只要找到第二个数字就可以。加减需要找到两个都没有计算过的数字。因为结果会放在后一个数字里,所以最后的结果就是在num[3]中

			if(s[i]=='x')
			{
				j=i+1;
				while(num[j]==6562)
				{
					j++;
				}
				num[j]=num[i]*num[j];
				num[i]=6562;
			}
			else 
			{
				j=i+1;
				while(num[j]==6562)
				{
					j++;
				}
				num[j]=num[i]/num[j];
				num[i]=6562;
			}
			if(s[i]=='+')
			{
				j=0;
				while(num[j]==6562)
				{
					j++;
				}
				k=j+1;
				while(num[k]==6562)
				{
					k++;
				}
				num[k]=num[j]+num[k];
				num[j]=6562;
			}
			else 
			{
				j=0;
				while(num[j]==6562)
				{
					j++;
				}
				k=j+1;
				while(num[k]==6562)
				{
					k++;
				}
				num[k]=num[j]-num[k];
				num[j]=6562;
			}

以下为100分C语言代码:

#include<stdio.h>
int cnt(int num[],char s[])
{
	int i,j,k;
	for(i=0;i<3;i++)
	{
		if(s[i]=='x'||s[i]=='/')
		{
			if(s[i]=='x')
			{
				j=i+1;
				while(num[j]==6562)
				{
					j++;
				}
				num[j]=num[i]*num[j];
				num[i]=6562;
			}
			else 
			{
				j=i+1;
				while(num[j]==6562)
				{
					j++;
				}
				num[j]=num[i]/num[j];
				num[i]=6562;
			}
		}
	}
	for(i=0;i<3;i++)
	{
		if(s[i]=='+'||s[i]=='-')
		{
			if(s[i]=='+')
			{
				j=0;
				while(num[j]==6562)
				{
					j++;
				}
				k=j+1;
				while(num[k]==6562)
				{
					k++;
				}
				num[k]=num[j]+num[k];
				num[j]=6562;
			}
			else 
			{
				j=0;
				while(num[j]==6562)
				{
					j++;
				}
				k=j+1;
				while(num[k]==6562)
				{
					k++;
				}
				num[k]=num[j]-num[k];
				num[j]=6562;
			}
		}
	}
	return num[3];
}
int main()
{
	int num[4];
	char s[3];
	int n,i,m;
	scanf("%d",&n);
	
	for(i=0;i<n;i++)
	{
		scanf("%d%c%d%c%d%c%d",&num[0],&s[0],&num[1],&s[1],&num[2],&s[2],&num[3]);
		m=cnt(num,s);
		//printf("%d %c %d %c %d %c %d\n",num[0],s[0],num[1],s[1],num[2],s[2],num[3]);
		if(m==24)
		{
			printf("Yes\n");
		}
		else printf("No\n");
	}
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

JY_0329

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值