标签:二十四点 return 0ms int sr else 字符 题目 CSP
文章目录
题目
解题思路
先做乘除,再做加减。
如3+4x5+3,可以将其先转化为3+20+3,再做加法。
具体算法是:利用递归函数,遇到乘除,先算出来,再回来进行加减。可以用符号+作为分割符,来划分。这要注意的是要先对初始字符进行预处理,如将3-4变为3+(-4),其中原来4的字符是‘4’,而我们需要将其变为‘0’-(‘4’-‘0’)这个值的字符,这样就实现了统一用+作为分割。
!!!一个坑:3x5/6x4应该为8,因为(虽然题目不是说的很清楚)要一遇到除号’/'就要完成整除操作,而不是按习惯等价于3x5x4/6得到10.
代码
#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;
}
测试样例
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
测试结果
标签:二十四点,return,0ms,int,sr,else,字符,题目,CSP 来源: https://blog.csdn.net/qq_42295427/article/details/104775884
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。