【百炼oj】2787:算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”。样例输入
5 5 5 1
1 1 4 2
0 0 0 0
样例输出
YES
NO

/*24点*/
#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<math.h>
#define MIN 0.000001
using namespace std;
double num[4];
int mark;
double operate(double a,double b,int k){
    double result=0;
    switch(k){
    case 0:result=a+b;break;
    case 1:result=a-b;break;
    case 2:result=a*b;break;
    case 3:if(b!=0)result=a/b;break;
    case 4:result=b-a;break;
    case 5:if(a!=0)result=b/a;
    }
    return result;
}

int func(int i,int j,int k){
    if(fabs(operate(operate(operate(num[0],num[1],i),num[2],j),num[3],k)-24.0)<=MIN)return 1;
    if(fabs(operate(operate(num[0],num[1],i),operate(num[2],num[3],j),k)-24.0)<=MIN)return 1;
    return 0;
}

void check(double*num){
     int i,j,k;
     for(i=0;i<6;i++){
        for(j=0;j<6;j++){
            for(k=0;k<6;k++){
                if(func(i,j,k)){
                    mark=1;
                    return;
                }
            }
        }
     }
}

int main(){
    while(1){
        int i;
        mark=0;
        for(i=0;i<4;i++)scanf("%lf",&num[i]);
            if(num[0]==0)break;
            sort(num,num+4);
            check(num);
            while(next_permutation(num,num+4)){
                check(num);
            }
            if(mark==1)printf("YES\n");
            else printf("NO\n");
    }
    return 0;
}

阅读更多
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页