算24
给出4个小于10个正整数,你可以使用加减乘除4种运算以及括号把这4个数连接起来得到一个表达式。现在的问题是,是否存在一种方式使得得到的表达式的结果等于24。
这里加减乘除以及括号的运算结果和运算的优先级跟我们平常的定义一致(这里的除法定义是实数除法)。
比如,对于5,5,5,1,我们知道5 * (5 – 1 / 5) = 24,因此可以得到24。又比如,对于1,1,4,2,我们怎么都不能得到24。
输入
输入数据包括多行,每行给出一组测试数据,包括4个小于10个非负整数。最后一组测试数据中包括4个0,表示输入的结束,这组数据不用处理。
输出
对于每一组测试数据,输出一行,如果可以得到24,输出“YES”;否则,输出“NO”。
四个数求24 可以转换为 先算两个数,再三个数求24
两个数求24 一个数求24
缩小问题规模
递归求解
#include<iostream> #include<cmath> using namespace std; #define spacesize 4 double inputnumber[spacesize+1]; #define EPS 1e-6 bool iszero(double x) { return fabs(x)<=EPS; } bool count24(double a[],int n) { if(n==1) { if(iszero(a[0]-24)) return true; else return false; } for(int i=0;i<n-1;i++) { for(int j=i+1;j<n;j++) { double temp[n-1]={0}; int iTemp=0; for(int k=0;k<n;k++) { if((k!=i)&&(k!=j)) temp[iTemp++]=a[k]; temp[iTemp]=a[i]+a[j]; if(count24(temp,n-1)) return true; temp[iTemp]=a[i]*a[j]; if(count24(temp,n-1)) return true; temp[iTemp]=a[i]-a[j]; if(count24(temp,n-1)) return true; temp[iTemp]=a[j]-a[i]; if(count24(temp,n-1)) return true; if(!iszero(a[j])) { temp[iTemp]=a[i]/a[j]; if(count24(temp,n-1)) return true; } if(!iszero(a[i])) { temp[iTemp]=a[j]/a[i]; if(count24(temp,n-1)) return true; } } } } return false; } int main() { while(true) { for(int i=0;i<spacesize;i++) { cin>>inputnumber[i]; } if(inputnumber[0]==0&&inputnumber[1]==0&&inputnumber[2]==0&&inputnumber[3]==0) { return 0; } if(count24(inputnumber,spacesize)) cout<<"YES"<<endl; else cout<<"NO"<<endl; } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探