|
楼主 |
发表于 2007-3-5 16:53:01| 字数 1,167| - 中国–陕西–西安 电信
|
显示全部楼层
嗯,有时间我按照各位的提议修改一下吧。其实我最想先把雷同的计算方法过滤掉,呵呵。。
程序用VC写的,算法上没什么难度。我刚刚在网上搜了一下,找到一个别人写的代码,感觉比我的精简,感兴趣的可以看看:
- #include <stdio.h>
- #include <stdlib.h>
- #include <math.h>
- char op[3], o[5]="+-*/";
- float n[4], on[10];
- int used[4] = {0}, top=0, tp=0, x;
- void chk(float k);
- void 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");
- 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]));
- }
- 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--;
- }
- void search24(int d)
- {
- int i, j, k;
- float p, q;
- if(d>=3) return;
- 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;
- }
- }
复制代码 |
|