算24点的代码 (刚写的作业 欢迎寻找bug)
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <conio.h>
char op[3], o[4]="+-*/";
float n[4], on[10];
int used[4] = {0}, top=0, tp=0, x;
void chk(float k);
int search24(int d);
float calc(float n1, float n2, char o);
void make(int i, float p, float q, char o, int d);
int main( void )
{
scanf("%f%f%f%f", &n[0], &n[1], &n[2], &n[3]);
search24(0);
printf("No answer.\n");
getch( );
return 0;
}
void chk(float k)
{
if( (tp != 3) || ( fabs(k-24.0) > 0.001 )) return;
for(x=0; x<5; x+=2)
printf("%g %c %g = %g\n", on[x], op[x/2], on[x+1], \
calc(on[x], on[x+1], op[x/2]));
getch(); exit(0);
}
float calc(float n1, float n2, char o)
{
switch(o)
{
case '+': return (n1+n2);
case '-': return (n1-n2);
case '*': return (n1*n2);
case '/': return (n1/n2);
}
}
void make(int i, float p, float q, char o, int d)
{
if(fabs(q)>0.001 || o!='/')
n[i] = calc(p, q, o);
op[tp++] = o; chk(n[i]);
search24(d+1); tp--;
}
int search24(int d)
{
int i, j, k;
float p, q;
if(d>=3) return 0;
for(i=0; i<4; i++)
for(j=0; j<4; j++)
if( (i!=j)&& (used[i]+used[j] == 0) )
{
used[j] = 1; p=n[i]; q=n[j];
on[top++] = p; on[top++] = q;
for(k=0; k<4; k++)
make(i, p, q, o[k], d);
n[i] = p; used[j] = 0;
top -= 2;
}
}
Dev C++ 4.9.9.0 (GCC3.3.1) 编译测试成功
假定输入的数据都是合法的
不需要判断输入错误
XX高手说
有3处错误
会导致某些数据求不出解
我左看右看
上看下看
就是看不出来
谢谢大家了