48行计算24点C语言代码(转载)

学写24点时无意中看到的非常高大上的代码。。。。。。

#include <stdio.h>
#include <string.h>
#define SWAP(t, a, b) do {t v=a; a=b; b=v;} while (0)
#define OP(o)   do { a[1].n = a[0].n o a[1].n; \
        sprintf(a[1].s, "(%s"#o"%s)", a[0].s, strcpy(t.s, a[1].s)); \
        if (dfs(n - 1, a + 1, r)) return 1; \
        a[1] = temp; } while (0)
typedef struct data {
    double n;
    char s[8 * 7]; // 长度看你需要而设定
} data;
data num[4], t;

int dfs( int n, data a[], double r ) {
    int i, j;
    if ( n == 1 )
        if ( a[0].n-r > 1e-8 || a[0].n-r < -1e-8 )
            return 0;
        else return 1;
    for ( i = 0; i < n; ++i ) {
        SWAP( data, a[i], a[0] );
        for ( j = 1; j < n; ++j ) {
            SWAP( data, a[j], a[1] );
            data temp = a[1];
            OP( + );
            OP( - );
            OP( * );
            if ( a[1].n > 1e-8 || a[1].n < -1e-8 )
                OP( / );
            SWAP( data, a[j], a[1] );
        }
        SWAP( data, a[i], a[0] );
    }
    return 0;
}

int main( void ) {
    int r = 24, i;
    for ( i = 0; i < 4; ++i ) {
        scanf( "%s", num[i].s );
        sscanf( num[i].s, "%lf", &num[i].n );
    }
    if ( dfs( 4, num, r ) )
        printf( "%s = %d\n", num[3].s, r );
    else
        printf( "No answer\n" );
    return 0;
}

转自:https://misakamm.com/blog

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值