标题: 48行计算24点C语言代码
作者: Demon
链接: https://demon.tw/copy-paste/48-24-c.html
版权: 本博客的所有文章,都遵守“署名-非商业性使用-相同方式共享 2.5 中国大陆”协议条款。
一份很早很早就发过的代码,现在发在这里做备份,同时用来测试highlight
此代码做简单的修改,就可以变成计算任意个数通过四则运算得到指定值的计算方法
同时作为DFS算法入门的参考
#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;
}
原文链接:http://blog.misakamm.org/p/222
赞赏
微信赞赏
支付宝赞赏
随机文章: