谁能给个24点的判断程序

问题描述

谁能给个24点的判断程序

就是给出4个数,求是否能够构造成24点,如果可以,输出yes,不能的话,输出no

解决方案

模拟手算24点的过程就好了,递归判断,就两种情况(((a ⊙ b) ⊙ c ) ⊙ d)
((a ⊙ b) ⊙ (c ⊙ d)),符号表示运算符
#include
#include
double num[4];
bool dfs(int n)
{
if(n==1)
{
//n=1时 最终的结果保存在num[0]
if(fabs(num[0]-24)<0.000001)
return true;
else
return false;
}
for(int i=0;i<n;i++)
{
for(int j=i+1;j<n;j++)
{
double x=num[i];
double y=num[j];
//已经使用过的数 使它等于最后一个数
num[j]=num[n-1];
num[i]=x+y;if(dfs(n-1)) return true;
num[i]=x-y;if(dfs(n-1)) return true;
num[i]=y-x;if(dfs(n-1)) return true;
num[i]=x*y;if(dfs(n-1)) return true;
//避免除0
if(y)
{
num[i]=x/y;
if(dfs(n-1)) return true;
}
//避免除0
if(x)
{
num[i]=y/x;
if(dfs(n-1)) return true;
}
//回溯
num[i]=x;
num[j]=y;
}
}
return false;
}
int main()
{
int n;
scanf("%d",&n);
while(n--)
{
scanf("%lf %lf %lf %lf",&num[0],&num[1],&num[2],&num[3]);
if(dfs(4))
puts("Yes");
else
puts("No");
}
return 0;
}

解决方案二:

 * 24.c 计算4个1到13之间的数(包含)是否能够通过加减乘除达到24.*/
#include <stdio.h>

#define MASK 0xFFFF
#define SHIFT 16
enum {FAILURE = 0, SUCCESS};
const char ops[] = "+*-/";

int test (const int nums[], char *result);
int calculate (int num1, int num2, char op);

int main(int argc, char * argv[])
{
    int len = 0;
    int nums[4] = {0};
    int i;
    char *result;
    if (argc != 5)
    {
        printf("Usage: 24.exe num1 num2 num3 num4n");
        exit(1);
    }
    for (i = 0 ;i < 4 ;i++ )
    {
        len += strlen (argv[i+1]);
        nums[i] = atoi (argv[i+1]);
        if (nums[i] < 1 || nums[i] > 13)
        {
            printf ("所有的数字都应该是1到13正整数n");
            exit(2);
        }
    }
    /*2 pairs of paren, 3 operators, 1 for NULL. */
    len += 4 + 3 + 1;
    result = (char *)malloc (len);

    if (test(nums, result))
        printf ("%sn", result);
    else
        printf ("No Matched.n");

    if (result != NULL)
        free (result);

    return 0;
}
/* 测试所有可能的情况,找到一种解法*/
int test (const int nums[], char * result)
{
    int I, J, M, N;
    int r, s, t;
    int ret, ret1, ret2;

    /*first loop: I J r M N s t ==> (I r J) t (M s N) */
    for (I = 0; I < 4; I++)
    {
        for (J = 0; J < 4; J++)
        {
            if (J == I)
                continue;
            for (r = 0; r < 4; r++)
            {
                ret1 = calculate (nums[I], nums[J], ops[r]);
                if (ret1 <= 0)
                    continue;
                for (M = 0; M < 4; M++)
                {
                    if (M == I || M == J)
                        continue;
                    for (N = 0; N < 4; N++)
                    {
                        if (N == I || N == J || N == M)
                            continue;
                        for (s = 0; s < 4; s++)
                        {
                            ret2 = calculate (nums[M], nums[N], ops[s]);
                            if (ret2 <= 0)
                                continue;
                            for (t = 0; t < 4; t++)
                            {
                                ret = calculate (ret1, ret2, ops[t]);
                                if (((ret&MASK)==24) && ((ret>>SHIFT)==0))
                                {
                                    sprintf (result, "(%d%c%d)%c(%d%c%d)",
                                        nums[I], ops[r], nums[J], ops[t],
                                        nums[M], ops[s], nums[N]);
                                    return SUCCESS;
                                }
                            }
                        }
                    }
                    /* second loop: I J r M s N t ==> ((I r J) s M) t N */
                    for (s = 0; s < 4; s++)
                    {
                        ret2 = calculate (ret1, nums[M], ops[s]);
                        if (ret2 <= 0)
                            continue;
                        for (N = 0; N < 4; N++)
                        {
                            if (N == I || N == J || N == M)
                                continue;
                            for (t = 0; t < 4; t++)
                            {
                                ret = calculate (ret2, nums[N], ops[t]);
                                if (((ret&MASK)==24) && ((ret>>SHIFT)==0))
                                {
                                    sprintf (result, "((%d%c%d)%c%d)%c%d",
                                        nums[I], ops[r], nums[J], ops[s],
                                        nums[M], ops[t], nums[N]);
                                    return SUCCESS;
                                }
                            }
                        }
                    }
                }
            }
        }
    }
    /* third loop: I J M r s N t ==> (I s (J r M)) t N */
    for (I = 0; I < 4; I++)
    {
        for (J = 0; J < 4; J++)
        {
            if (J == I)
                continue;
            for (M = 0; M < 4; M++)
            {
                if (M == I || M == J)
                    continue;
                for (r = 0; r < 4; r++)
                {
                    ret1 = calculate (nums[J], nums[M], ops[r]);
                    if (ret1 <= 0)
                        continue;
                    for (s = 0; s < 4; s++)
                    {
                        ret2 = calculate (nums[I], ret1, ops[s]);
                        if (ret2 <= 0)
                            continue;
                        for (N = 0; N < 4; N++)
                        {
                            if (N == I || N == J || N == M)
                                continue;
                            for (t = 0; t < 4; t++)
                            {
                                ret = calculate (ret2, nums[N], ops[t]);
                                if (((ret&MASK)==24) && ((ret>>SHIFT)==0))
                                {
                                    sprintf (result, "(%d%c(%d%c%d))%c%d",
                                        nums[I], ops[s], nums[J], ops[r],
                                        nums[M], ops[t], nums[N]);
                                    return SUCCESS;
                                }
                            }
                        }
                    }
                }
            }
        }
    }
    /* forth loop: I J M N r s t ==> I t (J s (M r N)) */
    for (I = 0; I < 4; I++)
    {
        for (J = 0; J < 4; J++)
        {
            if (J == I)
                continue;
            for (M = 0; M < 4; M++)
            {
                if (M == I || M == J)
                    continue;
                for (N = 0; N < 4; N++)
                {
                    if (N == I || N == J || N == M)
                        continue;
                    for (r = 0; r < 4; r++)
                    {
                        ret1 = calculate (nums[M], nums[N], ops[r]);
                        if (ret1 <= 0)
                            continue;
                        for (s = 0; s < 4; s++)
                        {
                            ret2 = calculate (nums[J], ret1, ops[s]);
                            if (ret2 <= 0)
                                continue;
                            for (t = 0; t < 4; t++)
                            {
                                ret = calculate (nums[I], ret2, ops[t]);
                                if (((ret&MASK)==24) && ((ret>>SHIFT)==0))
                                {
                                    sprintf (result, "%d%c(%d%c(%d%c%d))",
                                        nums[I], ops[t], nums[J], ops[s],
                                        nums[M], ops[r], nums[N]);
                                    return SUCCESS;
                                }
                            }
                        }
                    }
                }
            }
        }
    }

    return FAILURE;
}
/* 计算两个特定的数和操作符的结果*/
int calculate (int num1, int num2, char op)
{
    int numerator_num1, numerator_num2;
    int denominator_num1, denominator_num2;
    int ret = 0;
    int denominator, numerator;

    denominator_num1 = num1 >> SHIFT;           //分母
    denominator_num2 = num2 >> SHIFT;
    numerator_num1 = num1 & MASK;           //分子
    numerator_num2 = num2 & MASK;
    /* 确定分母,将分子同一化*/
    if (denominator_num1 > 0 && denominator_num2 > 0)
    {
        denominator    = denominator_num1 * denominator_num2;
        numerator_num1 = denominator_num2 * numerator_num1;
        numerator_num2 = denominator_num1 * numerator_num2;
    }
    else if (denominator_num1 > 0 && denominator_num2 == 0)
    {
        denominator    = denominator_num1;
        numerator_num2 = denominator_num1 * numerator_num2;
    }
    else if (denominator_num1 == 0 && denominator_num2 > 0)
    {
        denominator    = denominator_num2;
        numerator_num1 = denominator_num2 * numerator_num1;
    }
    else
    {
        denominator = 0;
    }
    /* 计算*/
    if (op == '+')
    {
        numerator = numerator_num1 + numerator_num2;
    }
    else if (op == '-')
    {
        numerator = numerator_num1 - numerator_num2;
    }
    else if (op == '*')
    {
        numerator    = numerator_num1 * numerator_num2;
        denominator *= denominator;
    }
    else if (op == '/')
    {
        if (numerator_num2 > 0 && numerator_num1%numerator_num2 == 0)
        {
        /* 分子可以整除,分母就没有必要了。*/
            numerator   = numerator_num1 / numerator_num2;
            denominator = 0;
        }
        else
        {
            numerator   = numerator_num1;
            denominator = numerator_num2;
        }
    }
    if (denominator>0 && numerator%denominator == 0)
    {
        numerator   = numerator / denominator;
        denominator = 0;
    }
    ret = (numerator<=0)?numerator:((numerator&MASK) | (denominator<<SHIFT));
    return ret;
}

解决方案三:

C语言的
#include

void main()
{
int sum,a,b,c,d;
scanf("%d%d%d%d",&a,&b,&c,&d);
sum=a+b+c+d;
if(sum==24)
printf("yes");
else
printf("no");
}

解决方案四:

第一行是#include "stdio.h" 没显示出来

时间: 2024-10-02 09:08:41

谁能给个24点的判断程序的相关文章

NSIS:判断程序是否运行并进行卸载

原文NSIS:判断程序是否运行并进行卸载 今天在评论里看到网友说要一个这样的功能,就简单写了一个,本来想做360杀手来着,但遗憾的是我从来不用360的东西,所在电脑上也没有360相关的软件进行测试,所以就写了一个"金山杀手",代码是通用的,稍稍进行一下修改就成"360杀手"啦,哈哈~~ 代码未作详细测试,但应该没有太大的问题,这里只是提一个思路,如有问题,大家有兴趣的自行修改吧. 代码附上: 01 SetCompressor /SOLID lzma 02 SetCo

iphone5-怎么判断程序是否在iPhone5上运行?

问题描述 怎么判断程序是否在iPhone5上运行? 应用里有UIViewController 类的接口,我希望应用在iPhone5中运行的时候会知道,怎么样在代码中判断出现在是不是iPhone5? 解决方案 现在.m文件中: #define IS_IPHONE_5 ( [ [ UIScreen mainScreen ] bounds ].size.height == 568 ) 然后: if( IS_IPHONE_5 ){ // 在iphone 5中} else { // 在其他iphone中

delphi简单判断程序30秒没有键盘和鼠标动作示例

本文为大家详细介绍下delphi判断程序30秒没有键盘和鼠标动作,这里给timer设置了1000ms)的参数,表示30秒的间隔,具体实现如下,感兴趣的朋友可以参考下哈   以下为原代码: (这里给timer设置了1000ms)的参数,表示30秒的间隔!! 复制代码 代码如下: unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs,

Linux中用PHP判断程序运行状态的2个方法

  这篇文章主要介绍了Linux中用PHP判断程序运行状态的2个方法,需要的朋友可以参考下 有时候在服务器上面写一些脚本的时候,经常要放到crontab里面定时运行.时间长了就有一个问题,那就是程序重复运行消耗太多的资源,怎么处理呢?下面我写了两种方法: 第一种:用linux里面的正则匹配 代码如下: function ifrun($clsname,$bf = 0) { //下面进行检测,如有一个进程正在运行,则不运行 $str=shell_exec("/bin/ps ax > /home

c-怎么判断程序包是否是linux 下的?

问题描述 怎么判断程序包是否是linux 下的? 怎么判断程序包是否是linux 下的程序呢?----我手里有一个项目源码,但是不确定是否是linux下的.怎么判断? 如果是linux下c编写的项目,使用命令行和eclipse执行有区别么?-----在linux下eclipse中导入项目不成功(在eclipse的import中打开项目所在文件夹,未找到项目.) 第一次使用linux编程,小菜鸟,希望大家能够给与帮助 非常感谢^_^ 解决方案 确实.一看工程就是偷得...不然问下作者就完了.稍微点

用javascript写的字符串加密程序,用if判断程序正常,用switch出错

问题描述 用javascript写的字符串加密程序,用if判断程序正常,用switch出错 大家好,这段代码实现这样的功能: 1.用户输入全是小写字母的字符串,不支持空格和标点符号: 2.程序将字符串中的每个字母,按字母表顺序,向后移动5位,并输出新字符串: <script type="text/javascript"> var str=prompt("请输入要加密的字符串:").split(""); var newStr=[]; v

web setup 如何判断程序已安装?卸载时提示用户是否要备份虚拟目录下的access db?

问题描述 websetup如何判断程序已安装?卸载时提示用户是否要备份虚拟目录下的accessdb?vs.net2005c#+access+asp.net我的打包程序想实现:1.判断是否已安装,如果已安装,用户要覆盖原来程序,提示是否备份数据库.2.卸载时提示用户是否要备份数据库?请大家给点思路,代码谢谢 解决方案 解决方案二:up解决方案三:?解决方案四:mark解决方案五:引用3楼begonia_ref的回复: mark

AE 如何用代码判断程序运行时,AxMapControl控件被选中激活

问题描述 AE10.0如何用代码判断程序运行时,AxMapControl控件被选中激活.我有多个AxMapControl控件,想实现数据加载功能:当点击哪一个AxMapControl时,就向哪一个AxMapControl中加载数据.请各位大侠指教啊~~ 解决方案 解决方案二:Control有个Focused属性,可以查看空间是否获取焦点,AxMapControl:AxHost,AxHost:Control,ISupportInitialize,ICustomTypeDescriptor,应该可以

Android判断程序是否第一次启动

本文实例为大家分享了Android判断程序是否第一次启动的具体代码,供大家参考,具体内容如下 public class Welcome extends Activity { private final long SPLASH_LENGTH = 2000; Handler handler = new Handler(); public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); set