算24点的代码 (刚写的作业 欢迎寻找bug)

LoveYouJustOneDay 2005-08-09 05:05:53
#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处错误
会导致某些数据求不出解
我左看右看
上看下看
就是看不出来


谢谢大家了
...全文
357 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiaocai0001 2005-08-10
  • 打赏
  • 举报
回复
我还准备找毛病呢!
这么快就结贴了!!!!!
xiaocai0001 2005-08-09
  • 打赏
  • 举报
回复
这样符合游戏规则么?
见谅,只听说过这个游戏,但具体详细的规则不懂
LoveYouJustOneDay 2005-08-09
  • 打赏
  • 举报
回复
但是运算不是封闭在整数域内的
比如
5 5 5 1
(5 - 1/5) *5
1/5 = 0.2
xiaocai0001 2005-08-09
  • 打赏
  • 举报
回复
问一下,24点游戏所进行的运算都是整数范围内的,为什么楼主要用float数据类型来存储输入的数据?
xiaocai0001 2005-08-09
  • 打赏
  • 举报
回复
你应该先把你自己的代码给出注释,让别人看你的代码想你的编程思路,一个字----累!
jixingzhong 2005-08-09
  • 打赏
  • 举报
回复
上面的饼子讲解正确。
LoveYouJustOneDay 2005-08-09
  • 打赏
  • 举报
回复
大家都只会语法吗?
  • 打赏
  • 举报
回复
char op[3], o[4]="+-*/"; //<----Error:o[4]数组溢出

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);
} //<--Warning:不是所有的通道都有返回值
}

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;
}
} // <----------Warning:没有返回值

yangang 2005-08-09
  • 打赏
  • 举报
回复
mark
jsjjms 2005-08-09
  • 打赏
  • 举报
回复
随便实现了几个,完全正常....
LoveYouJustOneDay 2005-08-09
  • 打赏
  • 举报
回复
我希望大家指出算法上的问题
不要局限于语法
LoveYouJustOneDay 2005-08-09
  • 打赏
  • 举报
回复
VC的 bounds check 在这里弄巧成拙了
jsjjms 2005-08-09
  • 打赏
  • 举报
回复
char op[3], o[4]="+-*/";
===> o[] = "+-*/";就两个waring.
--------------------Configuration: aaa - Win32 Debug--------------------
Compiling...
aaa.cpp
E:\asm_prac\aaa.cpp(41) : warning C4715: 'calc' : not all control paths return a value
E:\asm_prac\aaa.cpp(66) : warning C4715: 'search24' : not all control paths return a value
Linking...

aaa.exe - 0 error(s), 2 warning(s)


两个地方没有返回值,加个return就没有waring.
具体实现还没有看....
jsjjms 2005-08-09
  • 打赏
  • 举报
回复
我的vc里面就一个错误.

--------------------Configuration: aaa - Win32 Debug--------------------
Compiling...
aaa.cpp
E:\asm_prac\aaa.cpp(6) : error C2117: '+-*/' : array bounds overflow
Error executing cl.exe.

aaa.exe - 1 error(s), 0 warning(s)
LoveYouJustOneDay 2005-08-09
  • 打赏
  • 举报
回复
char o[4]="+-*/"; // 足够了,不当作字符串处理

<----------Warning:没有返回值 编译器默认自动返回int值
尽管如此 ,写上去更标准一些
xiaocai0001 2005-08-09
  • 打赏
  • 举报
回复
不好意思,是两个警告
xiaocai0001 2005-08-09
  • 打赏
  • 举报
回复
我的VC6.0给你提出1个错误,三个警告!
char op[3], o[4]="+-*/"; //<----Error:o[4]数组溢出

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);
} //<--Warning:不是所有的通道都有返回值
}

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;
}
} // <----------Warning:没有返回值
xiaocai0001 2005-08-09
  • 打赏
  • 举报
回复
你就直接问那个XX高手呗!

69,337

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧