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