=min+i;5 w, `2 H. l. _
Num[count-1]--;
6 X- ^" ?6 @5 j7 i! M& m}
7 ?, R. T- u& ?: y0 }. `1 L
4 @/ T. C5 j, ^3 w# W9 d: p' v9 y$ G
1 d% R% h1 a; g) @8 K4 \- l
$ F6 ~. Q! T5 ]: C- m
[此贴子已经被作者于2004-5-2 14:50:47编辑过]
9 q* `$ R% U& S" F0 d
作者: 游侠无极限 时间: 2004-5-2 14:54
本法穷举出所有用min - max之间的num个数组成算式,结果为sum的情况
; ~5 }- O2 J% c$ W* J
( ?) p& Z* g. [0 y4 q/ u4 D如要具体的话,可以不穷举操作数,直接输入操作数,进行操作符号穷举[attach]12666[/attach]
作者: yzhlinux 时间: 2004-5-2 15:17
以下是引用游侠无极限在2004-5-2 14:41:26的发言:8 e6 L( g3 Q6 D2 N$ b
#include + f2 v' x& ?, j% _' O
#include
$ Y8 T0 g; b5 q
* Q: | T$ P/ B% {* k int EnumFormula(int min,int max,int num,int sum);
( J5 L( C4 a# U3 i( N: X void ShowFormula(int *Num,int *Sym,int count,int sum);
9 b; h" c9 N6 ]; e- k5 C double GetFormulaVal(int *Num,int *Sym,int count);( k1 C3 L3 ?% U' F3 j+ |
int EnumArray(int *Num,int min,int max,int count);
0 U, D5 U4 U d; b8 C void InitArray(int *Num,int min,int max,int count);- Q0 O8 K) { W# v0 V5 q
const char cSym[5] = {0,'+','-','*','/'};+ v$ x4 |" E+ V( [8 ]
9 ]5 I2 p& @& E! l! i* a9 N int main(int argc, char *argv[])
$ h4 j, G: ?/ a. J1 ~ {& M$ ~& D, q/ x5 {: f! h4 y
printf("总计%d个式子\n",EnumFormula(1,10,4,24));
Z. L" }+ { l% j0 E system("AUSE");
. K% r* M2 R6 O# m return 0;
" v0 q- A* ?& w l! j: A }6 t* e% t# |/ O" \
; @; @5 p$ }% E* P( {1 R7 a int EnumFormula(int min,int max,int num,int sum)
1 C% a0 _' Y6 Y* B0 J2 d: Z {
1 R" j1 e$ V4 @& u, C; k6 D+ o9 E int *FormulaNum = (int*)calloc(num,sizeof(int)); //储存操作数
, G: u6 h T- y* F2 ^ //储存操作符号( p" |6 ^- g/ J; x
//最后一位用于穷举结束标记5 w. B0 v- y0 l
// 1 - 4 代表 '+' '-' '*' '/'
) x |7 Q) Q) d6 I int *FormulaSym = (int*)calloc(num,sizeof(int));# V7 K- I$ }) ~6 D$ |
& [ ^) e' ?7 N. b int result = 0;. N0 ?% {2 E b' h9 x, K: `
// 初始化操作数和操作符号数组
1 L9 O) o6 [3 l
8 v6 W3 [6 J5 g+ [8 C2 Q% E int i;2 ~3 N' z, W6 X- V
6 d+ F2 f3 |/ d8 `
for(i=0;i = min;- O* g3 S2 \/ X: f- L8 s
for(i=0;i = 1;2 t" s. e* d+ a9 Y0 G
FormulaNum[0]--;
* p7 E A6 d0 f6 y2 c, R
( g% Q9 V$ q- j5 o7 b InitArray(FormulaNum,min,max,num);
& J! l! O+ D' S0 g7 _ FormulaNum[num-1]++;
# s4 z! e) y& {$ l2 ~ // 穷举操作数和操作符号组合, t" X4 g) R" h5 n
while(FormulaSym[num-1] == 1)6 x, ~* f* l' u/ U* Q% }9 K
{
6 i" V, n/ _% j1 r double t = GetFormulaVal(FormulaNum,FormulaSym,num) - sum;
- x8 t1 A7 ?" O6 r if(t>-0.01 && t<0.01)
- o9 t2 b0 j: ~! J { h9 @( |% {# U) t7 _3 D4 c3 u
//printf("%d %d %d %d | %d %d %d ",FormulaNum[0],FormulaNum[1],& e: {( o: b) i$ c/ k
//FormulaNum[2],FormulaNum[3],' Q0 G3 o4 v: z; `
// FormulaSym[0],FormulaSym[1],
- J& J9 E$ h0 l) R# w // FormulaSym[2],FormulaSym[3]);
' z7 ?% t7 [1 B- G, Q3 D ShowFormula(FormulaNum,FormulaSym,num,sum);) V. R' v# D+ o$ b3 t
result++;
9 u2 f* y: E! r }
7 ?, W! p! i. A- {5 b: t6 n/ g % D6 h! p, J$ Q5 R8 M9 K6 p
// 依次穷举操作数( Y5 m8 Y3 [; E) j
# w% I& f, C6 n& g2 m/ J //允许数字重复的穷举; d' m' ? X$ ]6 a' T
//FormulaNum[0]++;& p! o0 R; Q& Y' `9 P' V# u" \
//for(i=0;FormulaNum > max && i
; @( B, g* @" n8 }# \& I* S6 | //{
) K- s5 @9 g; N6 A5 { // FormulaNum = min;
% l' q6 o0 x+ i" G // FormulaNum[i+1]++;6 y% H( ?) d- K0 S& g
//}
; b) @" R) K/ ~# N5 R2 a+ f) O // 操作数穷举与操作符号穷举联接: J% I+ W2 X5 B, O- _) u
//if(FormulaNum[num-1] > max)
( J. ^$ {5 d# E+ |& o //{: ^& F h0 z& K4 Z8 j# p- A+ Y
// FormulaNum[num-1] = min;
( u' [& i6 t2 ]! Z& Z // FormulaSym[0]++;
# `- G v' p s5 j //}* L, C9 F1 O0 s" `* q
" b* i5 D6 E. I: [8 p5 _ // 不允许数字重复的穷举
3 J" c5 Y( E) q- o, g& x1 p // 数字必须从小到大的排列,防止重复2 M, m' d7 i% P$ x3 M
if((max - min)< num) exit(0); // 出错" K0 E% w7 h3 q4 h+ W
& K8 A# l$ \- Z( ?9 e, E9 X
if(EnumArray(FormulaNum,min,max,num)); | ?/ a/ D% F1 Y2 @
{
* s+ E, \$ [: T; B FormulaSym[0]++;
- E2 T; d3 { v" Q) R1 q% J InitArray(FormulaNum,min,max,num); r, O/ G1 U# O- M
FormulaNum[num-1]++;9 d B* s% ~) F8 y! l/ X
}* q! J7 [4 d8 ?6 ^
/ \; } t+ }' s
// 操作符号穷举+ m4 e s( b, Z1 Q6 H+ N1 T% {7 ]
for(i=0;FormulaSym > 4 && i r3 h3 I E1 ^% z0 B0 C {
( ?+ c$ D; r% C! V( v) g FormulaSym = 1;
1 }6 y1 F* X3 F) l. k3 b6 Y FormulaSym[i+1]++;
$ {8 f. j4 U7 G# Q }
3 c* Q! o2 ]1 A: C- V; R- \ A/ |
}, E }- L' [3 ]/ r; x$ A
//释放空间# A' K+ [9 ~7 ]0 v# G5 k
free(FormulaNum);
" t" q" q' t. ~6 N- E* V6 e4 F9 f7 R free(FormulaSym);
% n, T; m, e! `& L return result;6 t) r/ R. C, k
}3 K9 Y1 @ y, V" z0 p; ~- Q9 P z
// 计算算式结果( t, J1 t3 h; u z8 s0 n9 e
double GetFormulaVal(int *Num,int *Sym,int count)
# g% J! p/ }9 b& A* Q6 N {
0 V, w+ m/ e5 R. h! q0 s5 ?2 d int i,j;
4 V9 W1 h6 m( ^9 p t0 V: h double preresult;7 H( A9 J. p% E6 R8 U c6 { c7 {
preresult = Num[0];
" A8 a8 |% M% W, i- J/ h! }" G i=1;j=0;# [! V: ]) P2 H) I9 W
while(i4 L1 B( q9 S) E, T b- [; _ {) N7 |2 s: m2 i2 }" A( Q/ K3 u
switch(Sym[j])4 x% J* d. n0 Q1 {6 B$ ^) f
{
- E/ l l6 u# D3 M2 w- l case 1:- m) s2 h- m; P, `/ _
preresult += Num;
$ [9 a$ j: r6 t# w9 b5 o break;" n3 V1 o* j& }5 c
case 2:/ U% i. d. Z& j/ V" I
preresult -= Num;
3 x: D$ r/ L: J5 r; }1 C' _4 L break;' |/ _1 K# f) O
case 3:
% D# N7 Q/ m- d+ Z/ \: ~ preresult *= Num;( f* r) B5 C' M) g
break;
! J9 x3 G7 w- n0 w. b case 4:8 Y" H4 b& g3 ?" { M3 u4 [
if(Num == 0) return -1000;
: @0 B9 w: j9 @1 ?$ M' z preresult /= Num;
4 E+ k) k* e+ u k2 Y3 a, o break;) J* a' F* Q$ b7 h# J
}
5 B& |% _- a' p& J: g u9 \ a i++;j++;0 g9 U* W O5 j8 I) u- t
}+ ]: m. G- O- Y8 K
return preresult; //进行修正1 }( D+ u$ x8 o/ \
}
- O% O$ a+ g8 V4 ^ // 打印算式4 c! _5 x8 g4 M# G' Q# K
void ShowFormula(int *Num,int *Sym,int count,int sum)- x# [- `! W; b6 g
{
' r, y4 X2 @& i3 S: g' a* I, @% Q7 b5 ^8 d# Y/ W! ]
int i,j,len;
2 B0 }' p9 o0 f3 ~ char *Formula = (char*)calloc(count*4,sizeof(char));
8 ^; M" K7 [5 o6 @+ W2 ?$ u5 P: j char temp[10];; L0 d D' ^. g7 U
itoa(Num[0],Formula,10);
# T$ r& e( G) u/ I/ V6 z$ [8 W i=1;j=0;; `, P7 X7 B U3 w. T( H" z
while(i7 M6 ]/ e6 I# F% u+ _
{
/ T; U) P+ t) N: t itoa(Num,temp,10);
/ y. L! K$ A6 m* d2 f/ W len = strlen(Formula);
3 } }5 U# Q+ Z3 N% N. b9 l switch(Sym[j])5 Y% W% F; W; F7 K2 Q: O
{$ S& S3 z0 i/ i1 ^6 s
case 1:
( l' p n9 }; ^- F case 2:+ B; m4 y) Z# }
Formula[len] = cSym[Sym[j]]; @" w3 u% g9 h
strcat(Formula,temp);
. V$ B) Y u; F: [5 [$ |( m break;& B. X( A0 Q7 M& H8 |, t9 F4 V4 w/ w# w7 u
case 3:
# T& w& }% ~: ~6 H case 4:
0 S4 G+ p' s4 k0 z5 q7 u
. g- z' J& T8 q/ n* O2 w4 E // 如果上一个操作符号优先级低于当前的,应加上括号
: ^2 M: o5 r2 _/ C if(j==0 || Sym[j-1] > 2)
8 ^9 E, \, g7 Y8 v% K; D {
1 G& P" ?5 P5 B, O Formula[len] = cSym[Sym[j]];
" ?* B% \" a$ o strcat(Formula,temp);
+ |7 A% P$ B$ q9 K* b$ W }' n0 H8 { M. \+ ~) N
else
+ D2 M4 @0 C, K9 O {
3 I3 C$ ~4 R5 Z/ i' E int n;; X. ^% q e6 t) S, L! V
char *FormulaTemp = (char*)calloc(len+1,sizeof(char));( b1 L* E/ W) l5 n
for(n=0;n. O: H: d* n; I& l {: _! r2 u+ b' C6 i. t9 p( @
FormulaTemp[n] = Formula[n];
$ G) w _( T0 g1 G7 X Formula[n] = 0;9 ^8 q7 D# T& I7 T& f# N3 E1 q: J2 x
}
$ F9 c* m- c ^0 i: {, V+ j Formula[0] = '(';
: D9 D" j8 v6 j7 f' u, J6 i1 f0 E strcat(Formula,FormulaTemp);; m. m3 E7 A6 o4 \, V& v3 |
free(FormulaTemp);
- I( Y9 M' c/ H# H Formula[len+1] =')';
+ S+ G( Z1 k3 K+ V1 a Formula[len+2] = cSym[Sym[j]];
) c9 L$ ]/ J i strcat(Formula,temp);
$ y8 Z6 B$ k1 B* G }
% V% H; e+ S; |% @ break;* D; l9 Q+ g, K I7 X2 y% u
}
% M9 i7 W- K- C0 O6 l i++;j++;
; }& u, V8 z5 A }( H& V# ~2 X) u0 U. X1 B' d" R
printf("%s",Formula);
+ t+ U& P3 y, k, t: f3 q1 K printf("=%d\n",sum);
( ~; N a: i7 v free(Formula);
6 s+ f, b! U% S! V) s }/ z4 g+ O4 L$ p( n+ s2 w3 t
2 ?* G! y; f/ L
// 以当前数组为基础得到一个从小到大排列的数组
- s. r4 r1 `7 `$ o! f // 返回非0表示穷举结束1 Z# B; u3 u9 f8 r/ L
int EnumArray(int *Num,int min,int max,int count)5 T$ j' C' [" X* I9 @% O
{2 [1 @* i* H- S3 S0 U
int i,top;9 O. j' A. N; c! C
top = count-1;, G" w# K/ C8 l7 A
Num[top]++;
: G/ m% o" ]6 d while(Num[top]>max-count+top+1 && top>=0)
, Q) F( \) l L& ?# H, E% N' v {0 I+ E$ h( a" F6 y+ Q; g
top--;
8 ]9 ]$ j, ?9 e4 |& A+ c Num[top]++;
) h8 T7 f+ n# ?$ I4 y0 k }6 p- h2 A2 O1 a6 p
for(i=top+1;i7 x. D% h5 I0 F
{! f7 [3 h; r: N3 {8 C2 _1 B4 B
Num = Num[i-1]+1;0 D2 Z5 q% q) Y' ~* d+ N
}' Z2 P/ C! P6 d; N. C$ l& C
if(Num[count-1] > max) return 1;
, \2 n' _' [2 g- K; t2 i1 F else return 0;" ^/ _9 v+ }/ t' J) h! U
}) v0 R W7 i, }" [# b* Z; B8 s
7 T) O" J& ]; K/ P8 G
// 不允许重复的初始化数组
8 ?, r1 ]% g; Q: D b( t; \ void InitArray(int *Num,int min,int max,int count)
/ w6 y; d! g4 Y {6 K. m, D2 F3 J8 Q! l
int i;% ^2 P k, L& L! g. ^
for(i=0;i=min+i;! o- s- g# J0 p' E
Num[count-1]--;
0 l8 E8 ^! |+ f. y }7 {: _- @7 A( h+ U, U
4 P& E0 R# r' G7 D( R- ~1 v
6 O9 |% u( e* l" U& M. [& a' {; a
# q, k" J& t% D7 m( V" g0 J/ P 8 |/ p( y% l9 d/ H
[此贴子已经被作者于2004-5-2 14:50:47编辑过]
2 _/ f X& t& S
p$ f% a/ k6 b% aprintf("总计%d个式子\n",EnumFormula(1,10,4,24)); 的运行结果是:$ l* S+ o$ q9 @5 F/ P' i6 P- @
1+4+9+10=24; G2 l0 B7 h0 v: R: c2 Z) T
1+5+8+10=242 z" ^5 i$ p3 q; B \5 I! k
1+6+7+10=24
- Y9 H9 m; [7 a; K0 i. {. `1+6+8+9=24
" O8 P/ Y2 M" T0 P# |2+3+9+10=24
. L+ b# t3 r* f* G2+4+8+10=24
, z) s; [0 E2 r0 k2+5+7+10=245 W/ ~: o; T/ }+ d; a+ F; t4 W3 y+ q* F
2+5+8+9=24
c! ^; H7 r9 I2 l8 b0 T4 p2+6+7+9=24
: k: H+ B3 d/ n/ A/ f6 x, Y3+4+7+10=24" E6 k8 Z! Z8 @# o0 J% \" }/ z
3+4+8+9=24
2 ?/ n4 ^% n6 W# X! a0 L5 t) c3+5+6+10=24
- m- t) V5 M$ Z5 e3 O3+5+7+9=249 W9 r$ V H) k) @; r6 k+ o
3+6+7+8=24% E: S3 c0 M& k$ [2 G+ _
4+5+6+9=24
1 _, h7 z6 B9 ^* B0 ]3 ~4+5+7+8=248 u9 M& m* b0 s+ S, r- N- i0 U
这是什么意思?似乎是找出了 1 至 10 之间的和是24 的数据,这和完成计算24点,差很多吧?
' I" F6 P" z0 |" J# J! o比如用户输入 2 ,5,7,8 程序应该能得到计算这四个数据得到24的表达式才行啊,这样就可以写一个游戏了。
0 H0 g; s: W$ }& M* q1 m如: 1,5,7,8 有如下方法可以算出 24
4 K8 l( X7 \ n5 e: C" \! |((1+7)-5)*8 = 245 q& _7 a W2 j% t- ?
((7+1)-5)*8 = 24
: k- A; `1 Z$ t! O6 P(1+7)*(8-5) = 24
L8 M# f+ t7 ^# n2 k(7+1)*(8-5) = 24+ [# @9 t0 ?+ y6 l. o$ D
((1-5)+7)*8 = 24
2 X: E/ O1 o) I((7-5)+1)*8 = 24) p6 @* m) x) \7 U
(8-5)*(1+7) = 24- G' y$ |7 Z: d8 @
(8-5)*(7+1) = 24
* u; a& B" y% L. V, B4 @8*(1+7-5) = 24; k: V6 o; V1 |* Q, X& E
8*((1+7)-5) = 24: k$ m0 P/ j$ H: m
8*(1+(7-5)) = 249 v X$ z- w9 i9 {: M3 F; h
8*(7+1-5) = 24
8 B# r0 w0 H0 S7 l8*((7+1)-5) = 24
. j( w3 h X/ u8*(7+(1-5)) = 24
1 M- G9 ]+ m% r8*(1-5+7) = 24
; f: c' f" ~6 t0 g8*((1-5)+7) = 24
' q, J2 p2 k. Z. }8*(7-5+1) = 24! q. @& z! @( p
8*((7-5)+1) = 24
/ }, }0 M( {3 q- l
作者: 游侠无极限 时间: 2004-5-2 15:21
结果是这样的:1 `, H+ W% X) |- j4 S* }/ i
1+4+9+10=24
8 E) Z9 c9 Z' O1+5+8+10=246 U" c8 f# c2 e" w& S7 m& @. m3 Y
1+6+7+10=24
) U/ ?3 d. w0 I$ P5 P* m1+6+8+9=24
9 U9 L; x4 R7 T, n( i, @2+3+9+10=24
- b6 `8 e; S. c# _: c2+4+8+10=24
3 p7 @/ Y9 h. C# k4 i2+5+7+10=24
" E2 {) p4 Q( s4 x# N2+5+8+9=24
" }$ }4 l. c# a( c1 f J, M2+6+7+9=24( y+ `' J! L. a. f
3+4+7+10=24
5 @7 X3 N+ {2 j+ Q c5 y% S3+4+8+9=24
, a* c+ R+ G9 [/ Q4 ] [" r3+5+6+10=24
' [- Q3 `* ]7 b, a ^3 I; V3+5+7+9=24 c1 v& O" Z& m/ p* |
3+6+7+8=24% k' s& j& o! s1 x7 N- o
4+5+6+9=24) P2 o1 G& B5 ?; V
4+5+7+8=24! \2 K2 Z& y( a: s. c" @
1*5+9+10=24
. I1 [. P6 B, ^' U/ H0 i! }9 C1*6+8+10=24- Y; a$ i# X% z8 ~& R2 M: ~* J
1*7+8+9=24
+ J; A. K. y9 z' y2 X a' D2*3+8+10=24' ~; ^0 Z% l; w! ]0 @1 M$ c
2*4+6+10=24
2 e8 T6 H% C% h' g' s2*4+7+9=24
! x& v, Q- }; }) W! j& H4 \2*5+6+8=242 J, ?4 f8 _! M0 m; C& V( v. J
3*4+5+7=249 A$ c' c& o' i) H7 ?8 @% q7 t; V
4*5-6+10=24 |& F0 ?* S+ c6 W' ~( ^- ?1 ^
(1+2)*5+9=24
4 C9 f: S8 r1 G(1+3)*4+8=24
6 N; n; U! g! s4 V1*2*7+10=24
& B9 Z: ~/ n8 k1*3*5+9=241 T- H8 |# A1 y+ @* b; g# Y$ B
6*7-8-10=244 S4 w ~! r) k! ]9 [" y1 a9 q
(2+4)*5-6=24/ R+ K& e( }- f- b. [: @7 x
2*3*5-6=24
+ Z" S+ y$ L; L+ r; x8 l(1+2+3)*4=24
) `6 ]8 H. N0 j(1-2+4)*8=24
|1 w& P! Q3 ^(1-2+5)*6=24% }3 l6 H5 f' F9 H
(1-3+5)*8=24
; v6 N. y, |+ J" ?(1-4+6)*8=24
6 v5 X/ ^1 X- F(1-5+7)*8=24
4 h1 Y9 B0 O# ]+ b6 s' x+ N(2-3+4)*8=24
: r6 h' q8 C# b5 \* J: ? B, N(2-3+5)*6=24! d9 P4 F9 g5 f# h) U0 c3 c
(2-4+5)*8=24
$ }) U6 f0 P3 w; l3 L(2-5+6)*8=24
2 n* i: ?/ J0 F2 G3 w(2-6+7)*8=24
7 C% e/ x$ P1 }7 Y. [% `(3-4+5)*6=24
) ]# G3 ]1 B/ _: }! k(4+5-6)*8=24
- \+ t3 A$ t: M+ s4 m1 S(4+6-7)*8=24
/ S+ S7 A$ h( P; N+ K1 ^ s1 ^9 m, \2 y(2*4-5)*8=24
1 @4 M: s8 }, V3 y- P% C% z* h(2*5-7)*8=24
8 u( P8 ~* [9 z- X! V6 z1*2*3*4=242 Z; i4 N0 r$ X$ ?- x
1/2*6*8=24
& R' h L. b8 |7 x4 ^, g1/3*8*9=24
* W' U; U0 @- j6 K) U8 I2/3*4*9=240 s- H" [: V# Z0 c& L! _
2/4*6*8=24- F3 u1 M# K6 O7 s3 f. {' `
2/5*6*10=24% _# V4 v$ p8 n9 ]; W5 E
2/6*8*9=24
6 K, q0 |; }9 y+ v3 r/ Y3*4/5*10=24- w4 Z7 p8 {$ [6 ?4 e2 F: ^$ ~
5*6*8/10=24
6 [8 j9 [; y9 u$ W总计57个式子
作者: 游侠无极限 时间: 2004-5-2 15:22
当然不会只考虑加法的情况,大概你复制的时候出现问题了,你可以下载这页最上面的那个程序
1 Q! F. U4 T9 {0 q$ i+ e1 c; i; b( f
作者: yzhlinux 时间: 2004-5-2 15:23
to 游侠无极限
+ W4 ]9 H/ W S- c1 X0 o/ E' m! Q. d你的方法思路比较特别,不过似乎更浪费资源啊,如果范围是1,100,那么你的循环将更多,而目前只是 sum 的,如果加上有 -,*,/ 和括号的话,那么就更多了,并且,如果游戏中规定可以使用三角函数,那么你这样就无法穷举出来了。
' _- l2 U# [" X! j参考我的代码中,由于是组合成合法的表达算式后在进行计算得到结果,判断是否24,所以对于符号的增加和三角函数的支持都很简单的实现了。都变成了字符串的组合而已
作者: yzhlinux 时间: 2004-5-2 15:28
(2-1)*3*8 这个算式你就没有啊,这4个数字的组合都没有出现0 @( F, Z, s- P a7 R3 u, W3 g7 g
$ N% @$ n$ |# h' `. P: u d
- J% m1 E& |# o) n& Y( F$ c. e3 G
2 Y) P* F- x8 z
6 U1 Q# Y3 q+ Y' h) G; }$ T
9 _- v8 e1 _( j8 D8 X, J& n, J7 i4 \2 y* }" z" x" o+ ~
[此贴子已经被作者于2004-5-2 15:32:12编辑过]
; ]: G/ K6 p7 Y- G
作者: yzhlinux 时间: 2004-5-2 15:28
似乎少了很多算式
作者: yzhlinux 时间: 2004-5-2 15:29
另外,玩游戏的时候应该是可以重复出现的,不规定4张牌都必须不一样吧。
作者: 游侠无极限 时间: 2004-5-2 15:35
[attach]12672[/attach]) t$ f+ \. B$ \$ l1 T; N' n
+ m) e/ C3 G4 H3 y
用这个好了,只不过输入的时候要按从小到大
! E4 y9 u0 g, d& q7 Y6 m6 v; n3 \% l: b) n4 w, e
好象有BUG,我暂时不太清楚
作者: 游侠无极限 时间: 2004-5-2 15:38
以下是引用yzhlinux在2004-5-2 15:28:15的发言:) g+ \$ M8 T1 D4 M6 l
(2-1)*3*8 这个算式你就没有啊,这4个数字的组合都没有出现
! H( X3 R% y) A" e4 z. P6 p1 L' y- A% w8 W9 W; G
本来为了防止诸如5 W- M# A5 S w+ J. G
1*2*3*4* L0 m- v7 _2 A) p+ H
1*3*4*2
J. C/ I! M7 J2*3*4*1
6 D, n1 a) O; H; T, m等的重复,只使用了从小到大的数组,不过这样好象也丢了不少可行的式子
; a/ F5 g4 q. c0 l8 i0 \
. Q! D0 O( A) Y' b另外你的程序就是有这些重复的3 k" m& {; Q% n+ ^( j, g3 O) p; z3 n! H
) L+ r# t Y3 H* ]4 R: RPS:VB的程序感觉就是慢好多啊. `4 ~* x/ j* w8 [4 C6 G( j9 |4 N
[此贴子已经被作者于2004-5-2 15:42:01编辑过]
( Y- Z' ~- A1 \7 X- A0 [5 q6 y
作者: yzhlinux 时间: 2004-5-2 15:40
以下是引用游侠无极限在2004-5-2 15:35:10的发言:+ N7 K4 D3 L3 g3 t3 ~
[attach]12672[/attach]
2 G7 ]" f4 m/ j" p) i( E' r" ]& K0 v2 u2 Y' u5 j& o+ Z1 n' N3 V
用这个好了,只不过输入的时候要按从小到大% h5 |: b3 W& m& d! m
+ \+ I/ _5 r' P
好象有BUG,我暂时不太清楚
/ G9 C8 O l& D- k' y1 u& v 好象不行啊,我输入 1 2 3 8 结果是 0个算式
作者: yzhlinux 时间: 2004-5-2 15:46
这些重复都是可行的算法,我想了很久,没有办法删除了,
# n+ }4 v/ G l' u' H% k比如 ) L# F4 E2 J1 R- \+ H& T+ d( F
1*2*3*4
& y. H. W! P' D8 k, L! W2*1*3*4
" y$ s1 Y# A8 n) k. K, p4*3*2*1
( | @: L8 D% r这些都是我们看来是一样的表达算式而已,对程序来说却是完全不同的计算次序,所以还真的难以在算法中高效率的取舍,看来只有在得到所有结果以后在进行一个比较来取舍了。那是比较简单的,不过又多加了步骤,时间也就花得更多。9 f' S: I/ @9 B. Z& ]$ j6 {+ S
不过如果游戏中不要求写出所有计算方法的话,那么可以在得到第一个算式的时候就停止
( I" ^. U2 m0 U" M* l/ A/ V( ~- s4 N6 X+ E: _* ^
8 K% S8 y0 q" ?% y* D X" z
! U- z; t- t; G$ E
9 o: _5 ~( f6 L8 {[此贴子已经被作者于2004-5-2 15:46:49编辑过]
! N9 ?5 P0 ~+ N/ y$ s
作者: 游侠无极限 时间: 2004-5-2 15:50
问题挺多了,我要再好好修改一下 m F# x0 K3 G- a
& t4 ^& Q+ f! y$ m8 h& u& T3 u( q3 f我本来想用波兰表示法进行算术计算的,给搞错了,哈哈
5 a5 P7 C$ d! D% h) Q9 k& c[此贴子已经被作者于2004-5-2 15:53:03编辑过]
1 o& Q6 R7 l! ~" ?+ F r
作者: yzhlinux 时间: 2004-5-2 15:53
以下是引用游侠无极限在2004-5-2 15:50:48的发言:! [" e4 j4 u" j q) u
问题挺多了,我要再好好修改一下
2 j# \, t6 N6 E" Z& _4 p
0 A$ O& h- s* Q% z5 h 我本来想用波兰表示法进行算术计算的,给搞错了,哈哈
: _. O4 ?+ |7 h
( G4 G4 U/ B% |5 l3 e还写啊?这么有空,建议帮我把vb的改成c的吧,优化优化,那真的可以写个小游戏了哦
2 I- T* h. ?* p r
! \+ }: j3 x$ T; g. f6 u
, F; L0 P/ Z0 ~ V8 i, n[此贴子已经被作者于2004-5-2 15:55:47编辑过]
2 k+ l' E y4 v0 T9 F/ A7 w
作者: 游侠无极限 时间: 2004-5-3 00:43
太晚了,现在决定用二叉树(第一次用)来做了,明天要出去,估计明天晚上能搞定
作者: yzhlinux 时间: 2004-5-3 09:04
二叉树来组合字符串到是比较简便的,这样应该可以去掉很多重复
作者: 游侠无极限 时间: 2004-5-3 22:41
[attach]12782[/attach]
1 }# q9 U( Y6 D g+ V9 b
& l6 t9 ~/ c/ v) d |2 d* J存在的问题:
1 w: S) F0 G, `0 g: c加法和乘法交换律引起的重复- E, d" H3 P1 G' |) i1 s
1*2*3*45 Z0 N: W6 O/ N0 E
2*4*1*3# }% g7 r8 j9 x! u2 K% ^' m
等的重复问题
# d8 A& j, y3 j原本输入的数存在重复导致的算式的重复2 J: t. X& i9 V" g. s
如:
6 j9 D; n" @/ F3 b8 ]2 h- x6 K) ^ E3 3 8 8 得 24点的- a9 i% Q# b V/ A0 g
8/(3-(8/3)) 重复
: x7 ~' \( _: T, N. z, {6 G1 R7 Y( N" O1 h4 u
括号问题, Z& h6 [5 ~+ z/ p* l
( w& |& y ~% v1 p6 p$ Z& K' @6 x% L2 m
+ D' }7 n$ m! V$ B
5 @2 u* h+ U( A( t% E[此贴子已经被作者于2004-5-3 23:06:15编辑过]
5 y I: ]& n4 }
作者: 游侠无极限 时间: 2004-5-4 08:43
[attach]12810[/attach]
! N: r( u: r: D8 J( w! u; }& r' T. J# }. o5 J0 `5 E0 i& O4 X
修正括号问题
作者: 唐明 时间: 2004-5-7 13:45
下面的代码保存为.htm的文件就可以了
) T/ ]- C9 Y3 E# j还是比较快的
9 U: p' i& S# O6 B' v7 {: k8 f
& t; \* U* r- d$ o1 h( W& K+ J4 X. S
1 d9 x. q: ~+ M" g; z
4 ^% ^' z) J% O# P$ F
; Y2 @( h1 u" u8 I0 {: T+ s$ h# _! E( g% r
1 u" }+ t2 @1 v; E' N3 p
4 a( g3 d. J) M! G% j$ s! v: P
& D( I/ R0 T! G
; ^0 ~% `" _* H3 X
7 Q+ g P1 |9 ~* j; n3 q
# u! a0 i ~. h4 Q) _
0 N" g. p) t) Z
6 ~9 V3 y, ]: }$ t; N x2 L
作者: 唐明 时间: 2004-5-7 13:48
没有取出重复的方法真实不好意思
作者: 游侠无极限 时间: 2004-5-7 19:09
晕,好多For ... Next,这样就是不太通用7 W# r% t8 ^$ H& E, _
# S: _) w, p9 i5 n7 L) `0 Q/ e
要除去重复的,实在困难,我想是不是可以给一个算式一个特征码,以判别是否重复,可以这个特征码不好找啊
作者: 唐明 时间: 2004-5-8 08:01
现在是vb可,我准备修改原来的代码
作者: yzhlinux 时间: 2004-5-8 09:49
以下是引用唐明在2004-5-8 8:01:19的发言:
0 y/ S+ D* p% d+ r现在是vb可,我准备修改原来的代码
' n8 B/ X. r! Z: ^4 N: A但是你里面还有错误啊0 g$ M6 Y8 Z" s; B
比如
8 z$ w/ e& y; {5 5 11 7 你的程序竟然得不到算式啊,而我用我的那个跑了一下得到如下8 G5 h+ U9 L1 J0 i& {' v
5*(7-11/5) = 24
& O" W" y) O$ c ^& P5*(7-(11/5)) = 24
! r( r6 U6 w9 A" Z5*(7-11/5) = 24
6 L5 p% B1 j; [; d5*(7-(11/5)) = 24* z0 [& ~; P" M; [5 [& Y/ X! }: o
; `3 A. F! @" x
For 好多,注释太少了,变量干什么的我都看不出来,所以你的程序那里出问题我也看不出来,那么多for差点看傻了,还不如低归舒服多了。 加油加油
3 o' O' a9 }# ~7 t. a& m3 A) s
0 E5 ^* t- [8 P# _# M% Z5 k2 J[此贴子已经被作者于2004-5-8 9:50:08编辑过]
6 F' o- V/ r+ h: |
作者: 唐明 时间: 2004-5-8 10:43
烦9 c0 c0 \& I1 a7 @* O, | V
[此贴子已经被作者于2004-5-8 18:29:04编辑过]
7 B3 a) s' v4 F: D9 V- `
作者: 唐明 时间: 2004-5-8 10:47
这些是原始的版本代码没什么测试
+ j+ `7 }9 L5 Y- j+ E0 H这次5,5,11,7还是个问题
作者: yzhlinux 时间: 2004-5-8 10:59
以下是引用唐明在2004-5-8 10:47:10的发言:
1 m. O3 [/ ^. `: [, O这些是原始的版本代码没什么测试
+ v) e: {# T5 p1 i5 l" P' T 这次5,5,11,7还是个问题
3 X. F& @8 }0 d9 a
我也是随便测试了一个,就碰上了: [3 Y6 J. u2 p% u! S
应该还有很多类似情况了; L, G; w+ T% z Y3 y
作者: 唐明 时间: 2004-5-8 11:12
请问如何实现4个数字的 所有排列方式1 l0 p+ z+ e9 A Z$ G4 c4 M: r% J
5,5,11,7的问题就在这里 e7 g: n. f* r; Q
向5,5,7,11就有结果了5*(7-11/5)
作者: 唐明 时间: 2004-5-8 13:28
" b/ S1 n7 {* I) W5 h[此贴子已经被作者于2004-5-8 18:33:46编辑过]
+ {& w& n& ]) Z. L: I f
作者: yzhlinux 时间: 2004-5-8 13:29
如果是只有4个数字,那么一共也才4!=4*3*2*1=24种,那么你全部列出来就可以了啊。24钟不算多。
作者: 游侠无极限 时间: 2004-5-8 16:35
标题: 几天前的东西,现在没有大兴趣了
过重复代码过多,比如二叉树的建立等等( B; B5 P3 x( b6 m5 s0 i: l
3 g4 c3 r, K* h) x
#include 4 c# z( N8 `$ k" p J; j$ U4 s
#include 5 R* E' Z \( b9 F: }/ B7 Q2 m: v3 T
& r; p; G9 t# _% F. \3 t4 t# Ctypedef struct node$ d. Q) O, O6 M+ h V
{
# F5 j5 M5 v1 l9 N0 }; b4 \ float Data;! [# `7 K# d; ?8 D& _- v
char Formula[100];
4 z/ A4 i$ d6 R, H1 \. K int frist; //优先级
$ p/ ]5 n# g( o4 j5 u struct node *Lchild;0 `, u4 h* N. ?! N! X5 v' N
struct node *Rchild; E, C5 [ T( W/ {
} BinTree;' Y/ W+ J9 a: ? S' B/ s+ K$ g
void CreatBinTree(BinTree *Tree,int *nArray);
$ }9 a. w" F9 vvoid FreeBinTree(BinTree *Tree);
9 ?/ J1 m; @3 l0 v, q+ d* q' Lvoid AfterBinTree(BinTree *Tree,void func(BinTree*));
. ~# ^. B2 P, Hfloat CalcBinTree(BinTree *Tree);
" w! R& `8 @" ^/ @/ u& vfloat GetFormulaVal(int *Formula,int count);3 Y! j( A! h* ]) \- L$ B, y; Y* ]
void ShowFormula(int *Formula,int count);' l; ^; J8 o' I/ G
void AfterNode(BinTree *Tree);* ]& D8 y" [* ]! G3 G/ A
void GetFormula(BinTree *Tree);
$ Z5 @# m9 E* e: {void Myitoa(BinTree *Tree);
& d; A- K9 V$ f6 O$ Zint EnumFormula(int *FormulaNum,int num,int sum);
1 ^$ y: X: r" D( |3 ovoid Restore(int *Formula,int *NumSym,int *temp,int count);
2 ]1 K/ V/ N4 \# C0 z6 ~4 l9 Qint IsOK(int *Formula,int count);
# s) F" m* U5 Y" Y- u4 y+ O; |int FindInt(int *nArray,int n,int len);
8 J2 R) ^( L) m2 u: qint UpZero(int *nArray,int n);. ?! F; l0 {7 w- u f) g
int IsDownNumSame(int *temp,int count,int num);5 o: m k) _8 O% ?5 {
, `/ D2 l( ~5 K5 c! h
const char cSym[5][2] = {"","+","-","*","/"};
: H$ C- i0 }% O( U8 b
$ B6 D9 f' _4 [; j' \; `int main(int argc, char *argv[])
, J, o( U. J7 W" f$ P{5 T: n0 u8 o+ |% q$ a: F
int i,n,*Array;
* E) [0 F% b9 t: B$ i# W% C : r" {6 @: A. ]8 H
//printf("几个数?");/ P$ I, @9 H3 |/ H
//scanf("%d",&n);
9 N& S- M) `; ^1 n" M n =4;
9 C/ B0 H4 y2 R7 D, S. I) ]% y0 O- V Array = (int*)calloc(n,sizeof(int));
; Y9 b6 G x$ Y2 m2 U printf("请输入%d个数(用回车或者空格分开):",n);
/ N6 t t; e$ u for(i=0;i& w6 Y4 U+ r' m; s+ Y scanf("%d",&Array);2 q; f( x; H# _$ v+ U- O
printf("总计%d个式子\n",EnumFormula(Array,n,24));: o% h$ i' A, {$ c
free(Array);- o5 U; d) i& u, J
& Q% F' b# x g( Y4 t$ V
system("PAUSE");: E6 s1 L( R0 g. Q
return 0;: [6 ]; \, v5 W$ Y1 \
}# A" L1 V w" h. U6 M5 D
* `7 s+ [+ e6 V& q0 zint EnumFormula(int *FormulaNum,int num,int sum)
+ v$ D1 W8 w4 m- |% d; Q{
5 R/ Y y) z |: Y int result = 0;) d& {5 H% R' i0 I
int *NumSym = (int*)calloc(num+4,sizeof(int)); //操作数运算符组成的可枚举组' n, v) C/ Y: c6 X9 j0 Q) B
int *Formula = (int*)calloc(num*2-1,sizeof(int)); //波兰表达式储存空间
+ C6 I0 q$ Z% M9 {6 u P" V int *temp = (int*)calloc(num*2,sizeof(int)); //波兰表达式的代号表示空间
) O' ~ C# L: ]1 d# K1 \ int i,j;
$ y2 q) j' O) b( i6 ?# x* ^9 c for(i=0;i = FormulaNum; //载入进行穷举的操作数% j* ?. |5 o0 E# Z4 M- }( y' I
for(j=0;j<5;j++) NumSym[i+j] = -j-1; //载入进行穷举的运算符号) E; ?" H& I* ?0 L/ F2 J' L, h
c* J5 c* p- c, o3 L( R5 m; [
for(i=0;i = 0;: i" n" l: Y% [
// 穷举开始,结束的标志为波兰表达式代号空间最后一位已进位,即前面各位已穷举完成
, |7 |2 r" K2 _. H1 @3 r while(temp[num*2-1] == 0)2 N9 D8 ] W3 Q6 A' a2 k9 ]1 @
{
2 M( Z" D; P$ V7 k0 @; l' s if(!IsDownNumSame(temp,num*2-1,num))6 h+ n- G C, W) Y" G# A- @+ L( j7 D
{
/ T ]# g' p# A Restore(Formula,NumSym,temp,num*2-1); //还原波兰表达式
9 E2 @/ D" k' s5 j- C+ K# y if(IsOK(Formula,num*2-1))$ t1 o, g, P# U; g- v
{" k* K! A" k& e! t; d! U
float t; //结果偏差8 L0 z8 X9 t9 F
t= GetFormulaVal(Formula,num*2-1) -sum;
( v- k5 i2 m, m9 F# V if(t>-0.01 && t <0.01) //结果为浮点数,只能进行近似比较
* z \9 I. R, _ x1 d5 l0 ~8 ~ {) h" @- d# { W3 J4 Z
result++;
& e, ?6 ?* Q( y2 j, F' b; i5 R# C& r ShowFormula(Formula,num*2-1);
, r1 x2 c7 O% f5 M1 U+ C }
* W5 t' S* U: E. i+ o } Q2 r9 Z) O2 i2 j8 ~6 h+ Q
}9 U3 W2 z/ J) Z
temp[0]++; //穷举动力
. @+ ~4 K: A# j6 l! |# N7 H& D for(i=0;temp > num+3 && i//代码空间类进位2 S2 e! E( p: T: S: v9 m3 p8 C
{
* b" |3 d! Q. F4 R) P2 g temp =0;
) w! A3 a* ]1 t# f) s2 F temp[i+1]++;
+ G3 B$ r5 c! d% d; i/ q }
$ I5 O. w: l# _) J+ L: F }
- A2 Z' N8 p, g# J& ~5 Z // 释放内存' Q$ X6 `- A0 K
free(temp);" v& b% W$ E* k' z7 t6 M
& v4 A0 h) Y7 s5 l' l) S4 Z: d- B$ d
//free(Formula); //??此处不知为什么会出现错误
0 N; e$ S% k; U3 z& I2 y+ T/ m free(NumSym);2 i* a$ F6 T& _& a. l, d) v4 M
return result; z7 Q8 Q4 v4 M9 O% o0 ]) a
} i! y5 \+ N5 g
// 由代码表还原为波兰表达式1 N7 Z( d8 O, y; \$ d k) T2 `% s
void Restore(int *Formula,int *NumSym,int *temp,int count)) J2 k" w8 m5 W9 w( [+ j4 W* r( Y+ \) E
{5 V3 p- _$ n0 b1 B3 A g% s
int i;8 m, o; N/ j. V
for(i=0;i = NumSym[temp];: C& Y. z$ r' O. b' I+ F9 P, a
}
4 C! X1 P; i$ Y! a( I// 判断是否符合波兰表达式3 Z' y! H* m/ E4 Y5 {( @# C% P
// 符合的条件是每个运算符号前必须是操作数个数多了运算符个数
4 ~! h G/ A: n9 |& _// 且运算符个数为总数减一的一半) }0 R2 v) j# O4 {8 T
int IsOK(int *Formula,int count)
8 }: k4 r- }# ~! D: R& `{
' q6 h/ {" Z, e int i,j;
9 _; X9 ~. l2 W* Q) ?4 s% S$ Y/ X for(i=0,j=1;i5 o9 {* B2 f+ `" P if(Formula<0)
$ q8 }, n4 a$ j0 u" b8 Z z7 r3 J if(UpZero(Formula,i)>j) j++;
( E9 U# T: G. w$ ` else break;
2 c' ~3 Q- j; H if(iint)count/2+1) return 0;
5 Q, z/ O4 U+ b/ b else return 1;
E& {: u1 s% b8 q6 S6 Q! k}
" {# y8 X% L( l. D// 查找数组大于0的个数 J& S4 W7 V/ E$ N8 l
int UpZero(int *nArray,int n)
, Y! E1 P" { g6 i3 R% g8 P{# V& j- N) @7 M7 }6 W m$ p
int i,result=0;* l0 U, u% I0 }: I% x
for(i=0;iif(nArray>=0) result++;
* X, g9 w% p2 A* e" | return result;+ F1 Q1 ?5 u8 v4 b0 B
}& G) F5 ]7 m+ f; }) y- S
// 查找数组中,小于Num的数是否有重复
4 k; b. [, R& h4 h7 R# J& Wint IsDownNumSame(int *temp,int count,int num)) w8 b4 k4 t- _! m+ Q
{6 V" W+ t* s' z% ?$ P1 m6 D) x
int i;( `/ g! k% M7 a4 r* N0 l+ ?
for(i=0;i6 i- @, n% c( l3 q* s4 z% d {3 ~# u6 B3 \6 N8 h+ W, s
if(temp < num)4 J" x& Y7 R8 b# D/ g$ t
if(FindInt(temp,temp,i) != 0) return 1;
. `9 Q/ P" i5 C6 [ }
& d1 P5 G8 _/ M/ X return 0;
/ ?9 y( m; \/ ]; g}( ~8 |0 Q5 \/ W2 g* E- s. N" \
// 查找数所在数组的位置,返回0为未找到
: d% o- e1 B+ a5 V% Tint FindInt(int *nArray,int n,int len) V# k8 N: r5 h' j; r& v- p
{" O/ _3 z2 p) C( G" }1 O0 t
int i;/ e, F h& {' c$ T
for(i=0;nArray != n && i4 c" o; z/ F. X5 ^/ D3 Z+ W2 G2 L if(i>=len) i=0;
5 B8 n, ?$ C5 ]0 c else i++;3 B+ B2 I2 d0 {, D D
return i;# Z4 ]+ A+ p# b8 A! e
}
+ ^' `* i1 @ u; h: E
+ M! @' P. ?! }' q, i( H// 计算算式结果2 r, h( f$ P8 `, B. m9 `
float GetFormulaVal(int *Formula,int count)
7 m. }5 E0 v" I{( w4 d% B9 g) ~; [8 D
float result;
* T5 F7 z! ~% B BinTree *head = (BinTree*)malloc(sizeof(BinTree)); //二叉树头节点3 b; `# H6 e/ I
int *nArray = (int*)calloc(count+1,sizeof(int)); //波兰表达式储存数组,首位表示数组有效长度9 y$ K, U' S8 S7 m3 ^3 z
3 t& I% i5 j& ?. o& E3 Q
int i;5 w2 \' V9 B$ L Z- q( G8 `* d
for(i=1;i<=count;i++) nArray = Formula[i-1]; //复制波兰表达式" `1 D" `0 W) A
nArray[0] = count;
n* s- }8 w" e5 Q CreatBinTree(head,nArray); //建立二叉树
3 f4 @/ _+ }6 l# t- {2 y6 T% M' \% R5 ~% q
result = CalcBinTree(head); //计算二叉树算式 Q$ C' P4 z) n/ H1 E5 F
AfterBinTree(head,&FreeBinTree); //释放二叉树空间3 {' Q) b# m w' v. B! F% E- ?8 a
0 f: o" ?6 m" U0 ?; ` D free(nArray);# i5 L/ N1 g) }) V& x P" O& a
return result;9 U' N9 o, W. i" m) [' x# l
}( V4 I0 ~" G' P5 J* c
float CalcBinTree(BinTree *Tree)
8 m& W4 T, z F+ M# Q7 v{5 B% T8 _7 `- G Z
( }- ~, o) x5 B- V* n% k: o AfterBinTree(Tree,&AfterNode);+ [' X6 u3 n! E; w
return Tree->Data;: ^" }% m8 w5 Q# Q6 p
}" y( B- k9 f4 s* l+ @
7 o% D* T! Y5 v; D/ o/ c+ n! p3 H
// 后序遍历二叉树进行计算,但会破坏二叉树本身
5 e4 {$ L. X+ R8 L- L% y// 一个结点的结果为左子树 (运算符) 右子树+ H; { m. ?5 ~ s4 k" ~9 G/ a6 l
void AfterNode(BinTree *Tree)5 z7 n7 M, U3 k" {
{
( o# @0 y4 k9 ^4 { switch((int)Tree->Data), ~6 {4 U/ a3 }& ^. `! Y; z
{+ f* w. e+ _+ x6 p7 Z2 l) i. A& X
case -1:
' @4 v( k/ {- V' t Tree->Data = Tree->Lchild->Data + Tree->Rchild->Data;! O' O8 x: i/ Q$ x6 K
break;2 t, |" c9 p! N
case -2:% u' v( F2 p% V) \# R* k
Tree->Data = Tree->Lchild->Data - Tree->Rchild->Data;# w: l* ~7 }5 d5 V* c# m
break;. ^' m; L5 P: D# q
case -3:
7 G p" |- N) Q" M# Z% p* g% a# g/ a Tree->Data = Tree->Lchild->Data * Tree->Rchild->Data;4 v6 U9 O M- y- V: @* T
break;1 b' I4 F L" K+ |4 d
case -4:0 A1 x1 t. I; [( ]
Tree->Data = Tree->Lchild->Data / Tree->Rchild->Data;
- ^5 J6 f, v' z8 v: F break;
4 {* z1 m$ g! H+ S }( n B- c6 s* {/ f1 ?
}
* x2 B$ D# F$ u8 V// 打印算式& l. ~. p4 s* a% [: P! @ `
8 q; L" X9 V" k9 @/ t& l* q
void ShowFormula(int *Formula,int count)/ f) w6 f1 N# E' l' p: v, w
{$ v# i0 Y" \: ^* g" I- N
BinTree *head = (BinTree*)malloc(sizeof(BinTree)); //二叉树头节点
I8 a' r) ^) U$ }- d' E" k/ I int *nArray = (int*)calloc(count+1,sizeof(int)); //波兰表达式储存数组,首位表示数组有效长度- @8 B8 ~. T+ I* G. l9 x) q2 V J
int i;
0 @' F( f- z# X( _/ u4 L for(i=1;i<=count;i++) nArray = Formula[i-1]; //复制波兰表达式
0 x% V7 B- F2 k nArray[0] = count;
" F0 F5 t. v. I8 I; E: ^( T; Z8 Z CreatBinTree(head,nArray);
1 O- L, w0 @8 l, t: B7 _. q AfterBinTree(head,&Myitoa); //初始化二叉树字符窜部分5 E @) P$ R2 x" |) q1 u
AfterBinTree(head,&GetFormula); //转化为普通表达式
3 `. y% Q6 p5 `- @& `7 x# X printf("%s\n",head->Formula);/ |8 j5 v: W/ F) o
AfterBinTree(head,&FreeBinTree); //释放二叉树空间 }& D2 a% q1 j) v
free(nArray);
- U% h, I1 z- z# G1 d- v! n
4 O7 E# [8 p0 L& E}' H- _4 Z9 L$ F7 W2 R
// 类似计算二叉树! c6 H8 ? O. N. h8 _
// 会破坏二叉树本身0 `( m$ k# \; w3 x' s5 ?5 W2 d
void GetFormula(BinTree *Tree)
' x. ~) J% t9 j0 m2 H) j5 z/ E+ h{3 Y5 o& f4 [- [0 T6 e8 @* ^
// printf(Tree->Formula);
9 { G6 Y* J* I% _6 G if(Tree->Data <0)
/ ^* z0 s A; J# A3 { {& X( @/ E2 J7 F
char temp[100];' E E' a6 s K6 U" M4 i6 ]
if(Tree->Lchild->frist < Tree->frist). q; |* _. @+ F9 N+ ^% v
{7 c% j# D+ c4 `6 A; p
strcpy(temp,Tree->Lchild->Formula);
: E3 F+ ?3 z7 K% M/ {0 R8 n strcpy(Tree->Lchild->Formula,"(");
) b; m4 S: @* D4 H, K( i+ w strcat(Tree->Lchild->Formula,temp);
, r: ~3 B4 l/ H! ^3 R strcat(Tree->Lchild->Formula,")");! L& [* j0 S6 a3 v% Y
}
+ M/ k( V& w. g" e! D+ B if(Tree->Rchild->frist < Tree->frist
/ Y5 l/ q: s5 f' y. o& \% k || (int)Tree->Data == -2 && Tree->Rchild->frist == 08 {5 [4 w/ T; `% r# f. u
|| (int)Tree->Data == -4 && Tree->Rchild->frist != 2)
; s) P( N; p+ [ {% P. e' t! V2 d9 S% E' T b
strcpy(temp,Tree->Rchild->Formula);3 y/ i, B. O/ C4 @
strcpy(Tree->Rchild->Formula,"(");
' p* k- _( y+ W0 v e strcat(Tree->Rchild->Formula,temp);
7 D: G% L6 | W4 ~% L& L2 h strcat(Tree->Rchild->Formula,")");! Z0 j( I0 A' O# A4 @! ^5 Y E' f
}/ r3 S' p3 f+ K6 B' @9 B4 R' n. d
strcpy(temp,Tree->Formula);
* \. E* E `" G# C$ Q, r strcpy(Tree->Formula,Tree->Lchild->Formula);* ?% O6 [1 q' _5 ~, p. D
strcat(Tree->Formula,cSym[-(int)Tree->Data]);
: i6 V k1 N O' ]2 N. f: v& h3 T strcat(Tree->Formula,Tree->Rchild->Formula);7 w! l! Z5 U: H8 E- d9 E. x: C/ l4 i
}8 \+ x5 f9 K8 Y% M5 ^# ~
}
( g, a- Q, H' _. G% u// 对二叉树字符串部分赋值
. i. T z0 k* \! o2 T; Kvoid Myitoa(BinTree *Tree)
+ g f, ~8 y0 n, d$ U/ ]{0 m" ?- i+ d, H5 a
if(Tree->Data>=0)* {/ o6 L5 [0 _! m4 t
{: Y; l' J; j+ D$ [4 Y
itoa((int)Tree->Data,Tree->Formula,10);
' i; R) j6 `, x Tree->frist = 2;
7 Q; \/ |% |5 p8 Z; M! G& ]* R }, ~- h8 t* W: ~( y$ k% w5 T
else1 g8 l7 C1 M0 _, ]7 H7 s: a' R
{
$ t; g4 t% {' G3 r" V3 { Tree->frist=Tree->Data < -2 ? 1:0;" T9 \. E* ^ V6 I& z
strcpy(Tree->Formula, cSym[-(int)Tree->Data]);6 R J; f5 x+ v
//Tree->Formula[1] = 0;
0 R, r& [2 M6 ?7 j: J" N, ^& D% D }
, V$ W! g8 L' @; o$ H) Z! L}
3 ?6 J) W, @1 f6 m9 Q//从一个波兰表达式建立一个二叉树链表,需指定一个头节点. V/ M( |+ k( i! @* Q8 ], m3 r
void CreatBinTree(BinTree *Tree,int *nArray). j$ x8 J: c2 m, V' D5 ?2 _: u
{
$ ^6 V5 I2 D- l% u) b& s @2 U: n Tree->Data = nArray[nArray[0]--];
" |* ^ w* v, p; F if(Tree->Data < 0)
: e4 r' W% w3 [, A' ~! f9 o {
+ R5 `1 U5 N# e7 C7 O* b8 }5 S& N Tree->Rchild = (BinTree*)malloc(sizeof(BinTree));/ h6 ^* J1 V2 S
CreatBinTree(Tree->Rchild,nArray);3 y* Q+ @$ M& s2 }- d
Tree->Lchild = (BinTree*)malloc(sizeof(BinTree));
& C3 O" b- F0 X7 B! W CreatBinTree(Tree->Lchild,nArray);
# d% w7 I6 @1 @1 [2 Q4 X) [: i0 O }
4 z- J4 `+ |1 l- i else; l3 p+ p g2 ~: s& Z
{# F2 b- k5 F8 G/ ^/ J1 \
Tree->Lchild = 0;
0 {+ H. {2 Z. q6 h Tree->Rchild = 0;0 q2 y8 P w) e/ T/ W/ \8 k
}; ?) x! e$ K# o5 f4 j
0 L4 A4 u* g7 ^6 \}
$ a W/ y1 s5 h5 H% o; j+ Z g9 S3 Q* z
// 释放二叉树空间
# k3 @" D; t/ F+ m% f U4 C6 Q# Pvoid FreeBinTree(BinTree *Tree)
* r" s: M8 Q4 _, R0 M2 A{
/ k: E9 A+ [& G# u, J8 K7 ^; K" |5 d free(Tree);/ x0 @9 M) s* F1 t3 L1 f
}; |/ I. i& K% a h& }
// 后序遍历二叉树1 @7 U/ r5 b( H
// 方便其他函数调用,func为要对各个结点进行操作的函数指针9 G; |/ y7 a/ d9 r5 K
void AfterBinTree(BinTree *Tree,void func(BinTree*))
2 a* a0 z! U8 K M' Q{' m) z# i* r- ^. Y: M5 H" C
if(Tree)
& @/ s! Q/ k( h {
/ a. ]9 l0 i: Z AfterBinTree(Tree->Lchild,func);
: X) u) F& r5 B6 o7 `; p+ r/ u AfterBinTree(Tree->Rchild,func);
/ c! y& T, ]/ }' h; g+ d9 F* l func(Tree);
0 {" V: l J9 V2 E! h, ^1 H F }
, N! {! F4 M/ z. R: x7 s}1 T- l m# f. d+ B! O/ F+ _
作者: hzzh 时间: 2004-5-8 17:31
这个题目不容易呢,好多高手都出马了,不错不错,不佩服的不行。
7 w! D4 L' }7 B7 q来了点好奇心,对游侠无极限 的程序运行了一下/ l' V- A% k1 f5 s; F' w
算法还没有看懂,为什么结果会都是重复的?
- f% N( Z1 m0 h“$ B! [9 P+ Q. x$ F* ~! H, o/ x
请输入4个数(用回车或者空格分开):5 5 8 8
1 @1 Y9 y, K7 N9 n: u. ]' Z3 \5*5-8/8
8 _8 D d' n, m; \7 u$ x+ W5*5-8/8
, d! ]& Z7 ?' }8 e$ E2 |8 F6 l5*5-8/8
7 Q, F/ Q4 }& I7 P. z* n5 `5*5-8/8* N( ~5 @. e: m( S
总计4个式子+ d4 X* E8 w- o/ k% \6 d
“
1 `3 \/ ~. w& N; y* D8 D' S另外程序有一点点小错误:2 s# a6 f% V$ N p3 N
”
6 E5 W: K1 }$ |0 K( p) hint EnumFormula(int *FormulaNum,int num,int sum)
( F' p$ Y0 S7 z! f/ {9 b! p{
1 v3 Z2 }! p8 J5 D int result = 0; B& ]0 K8 O0 y
int *NumSym = (int*)calloc(num+4,sizeof(int)); //操作数运算符组成的可枚举组$ z$ M, C J9 Z
int *Formula = (int*)calloc(num*2-1,sizeof(int)); //波兰表达式储存空间# W: P4 Q @; }) c `5 D' M
int *temp = (int*)calloc(num*2,sizeof(int)); //波兰表达式的代号表示空间
. R$ H; b0 m2 ]" J, d int i,j;
) O/ `9 F; h1 Y for(i=0;i = FormulaNum; //载入进行穷举的操作数2 w% n, j6 c* W- y& ]" b
for(j=0;j<5;j++) NumSym[i+j] = -j-1; //载入进行穷举的运算符号
# S( ~: a6 h5 F+ w$ W+ B% J “- V" Z0 z7 c) k$ C' \% j
前面定义: int *NumSym = (int*)calloc(num+4,sizeof(int)); //操作数运算符组成的可枚举组
% @! d) `) s/ a# [5 a1 O" s: G$ u后来二句:, E, p8 d5 ^: w9 c4 j
for(i=0;i = FormulaNum; //载入进行穷举的操作数
* s( B1 M# a7 J4 Q/ O; C for(j=0;j<5;j++) NumSym[i+j] = -j-1; //载入进行穷举的运算符号/ [( W( ]% j3 z1 O+ A. q5 K- l
当num=4时,经过第一个for,i=4,第二个for中 NumSym[i+j], i+j=8,NumSym越界了$ l$ I" w" A5 c# s5 I4 Q
作者: 唐明 时间: 2004-5-8 18:11
‘最后一次发代码
5 c9 [3 h* ?" n" Z( ?$ ?0 D( b1 j. p- y
3 J( G, C2 U, A) k/ l: O2 l
+ A1 ?9 |, ]) [- }
* B" i) K9 V l0 C% N0 L1 {2 s- S' t+ J5 q( A0 U1 } e# I6 k
: X1 S8 i) m4 R" r' a% s; o/ W% s6 \
5 q) u- Q6 P# y$ ~: E1 m$ \/ W) l 6 K& H) B* \" ]
. m* R$ H1 r0 y( s/ {9 k! p/ V
+ ]$ N3 _! G( w3 u- k3 j$ W+ o1 G + m# J; y% D: ^2 w$ I
7 F) A3 {% f* \
$ a1 X e5 x- w+ t2 g
: o" [# \# E8 {
3 f0 \1 E8 `( t! ^
& s4 s: `( x m; P. z. }) {$ a, k 1 ^; p" J+ v4 `' \) P4 w
5 g" `& Q# }7 Z* m4 W8 U$ @4 o# F
2 k6 }% M# G) H5 u/ T! I: Z0 r" u
+ \# P, N# X0 v2 V% Z[此贴子已经被作者于2004-5-8 18:20:59编辑过]
, H8 `$ g4 o, k1 }; O
作者: yzhlinux 时间: 2004-5-8 18:42
佩服佩服,不佩服不行了,
. k( T5 O) E+ f, O# }% h2 Z代码越来越工整,注释越来越详细实用,
3 J# \" d- P: ?+ P8 ]+ Q真是长江后浪推前浪啊,前浪死在沙滩上
作者: 游侠无极限 时间: 2004-5-8 21:11
以下是引用hzzh在2004-5-8 17:31:09的发言:
" ]: P$ p V! |+ k: ^- q' o/ J这个题目不容易呢,好多高手都出马了,不错不错,不佩服的不行。
5 {' ^6 b$ E) l' ~+ @ 来了点好奇心,对游侠无极限 的程序运行了一下
g* B. i* G9 L1 Z% Y) b4 G 算法还没有看懂,为什么结果会都是重复的?+ N! f' N2 B. }2 N3 \& W! g1 w* ?
“4 w9 a& v6 g' x9 F* D
请输入4个数(用回车或者空格分开):5 5 8 8& D/ s; `) S2 I
5*5-8/8
) l% a& b0 ~7 O8 D4 h 5*5-8/8$ t4 I$ A; K( J, t$ y5 g
5*5-8/8
: }# _ p& a$ B- W- g9 d 5*5-8/8- {$ o$ k- y, }3 I# P
总计4个式子
) G* j: z7 |( F9 z “
2 @0 |3 o( v# x9 e+ @5 J: L) L1 G. | 另外程序有一点点小错误:
1 ~/ `7 r) h$ u$ L( \1 }, [ ”5 H* {( h2 u7 H. q8 F6 M, J
int EnumFormula(int *FormulaNum,int num,int sum), |6 J9 ?8 m# s2 }$ T" i
{
3 d* Q( f' l2 F- e K0 ?. m int result = 0;
7 O0 \4 i; a* W4 e6 ?) \- b int *NumSym = (int*)calloc(num+4,sizeof(int)); //操作数运算符组成的可枚举组8 y/ s/ O3 \& Q7 \
int *Formula = (int*)calloc(num*2-1,sizeof(int)); //波兰表达式储存空间
z- v( P W2 l/ O) c0 B* X- a8 C int *temp = (int*)calloc(num*2,sizeof(int)); //波兰表达式的代号表示空间+ k7 m8 \, {( ]- a1 k: A
int i,j;8 s! D ^7 x: d
for(i=0;i = FormulaNum; //载入进行穷举的操作数
' |3 l4 b' ?6 b% C% h5 I* M4 O for(j=0;j<5;j++) NumSym[i+j] = -j-1; //载入进行穷举的运算符号
3 k# _2 A9 a0 a! R “' ]- q8 e" l6 m6 R
前面定义: int *NumSym = (int*)calloc(num+4,sizeof(int)); //操作数运算符组成的可枚举组
, p8 d4 {4 q) F4 _ 后来二句:1 C: u4 P/ x; R( q
for(i=0;i = FormulaNum; //载入进行穷举的操作数- p" q2 Y$ X, ?# E2 C" c2 `) H
for(j=0;j<5;j++) NumSym[i+j] = -j-1; //载入进行穷举的运算符号
: J: H: v1 a; R0 ~* H+ w% d7 S5 L2 ` 当num=4时,经过第一个for,i=4,第二个for中 NumSym[i+j], i+j=8,NumSym越界了9 u. |& k3 |& i- i* ^
9 R3 H1 J* a. }
% ?% _. l9 F: G* a+ K
真是太感谢了,想必释放错误是由于这个越界啊
* S. z: f m$ b1 c* D2 s7 T至于重复,其实是这样的:8 J8 |( p8 y9 S, N
你输入的 5 5 8 8,在穷举中,第一个5和第二个5不等价,同样第三个8和第四个8不等价,所以结果是 5 r) ~5 j5 g# ?6 Z$ r `
5(1)*5(2)-8(3)/8(4)
+ L+ b8 C2 D0 Q4 u& o5(2)*5(1)-8(3)/8(4)" l9 f. z# R# y' p
5(1)*5(2)-8(4)/8(3)+ Q! ^ w5 n# M. J" {
5(2)*5(1)-8(4)/8(3)
/ G4 r1 F1 s) }% z8 {
作者: 唐明 时间: 2004-5-9 12:21
给游侠无极限 k# p5 k- k( C! q S- \
定义! C7 U l" B+ P! [# k8 { I! y
操作数: v1,v2,v3,v4 就是4个数字+ S+ G8 m6 e" x
运算次序:px,p1,p2,p3,px 计算的顺序,比如9*9*9*9是6,1,2,3,6 || 5*(8+9)/3是6,3,1,2,6 等等
" ^; ?7 E: C& b" J 运算x,o1,o2,o3,ox 进行的计算
6 r4 T% V! Y# V' @( B# o7 c1 f" L( Y( Y操作数串: s1,s2,s3,s4
/ z- C; H: s0 m! J, x- o$ l 特征马: v1-o1-v2-v12-o2-v3-v123-o3-v4 这是按照p1,p2,p3的次序且v1>v2,v12>v3,v123>v4
% b" X) }, c9 c' p1 Y& ^
3 y+ C" ^ |- b. U次序px=6
; Z4 W; M/ ?3 _' Q) U运算ox="="" Z5 A; t1 x- v5 t4 r% h
) h* L7 R1 ]2 c; ^* ~
1)次序为 : "()" > "/" > "*" > "-" > "+"' S& p& h) ^* e6 e+ A
相应级别: 5 4 3 1 0
- z- f" C; |+ D8 }4 j2)检查前面 / 后面的运算,如果与现在将要进行的相同则继续检查前"面"生成的特征马的"后"面一个操作数/"后"面生成的特征马的"前"面一个操作数,"前"面生成的特征马的"后"面一个操作数>现在的"后"操作数 / "后"面生成的特征马的"前"面一个操作数>现在的"前"操作数,则跳出运算 (5月13日注:这规则是在前后都有计算过的运算时)$ J! d* j. w% k* `& g3 q
3)"+"/"*"作运算时"前"面的运算级别与现在将要进行的"相"同则"前"面的运算的"后"操作数必须是>=现在将要进行运算的"后"操作数,如果不符合则跳出运算, _/ t/ }1 \, \% @8 d
4.1)"/" / "*"检查前/后面的运算,小雨当前运算级别超过1,则在相应操作数串上+(). t: G8 Z \- e' Y9 V
4.2)"/"检查"后"面的运算级别<=4,则在相应操作数串上+() 如果认为/(a/b)=/b*a /(a*b)=/a/b 则"后"面的运算级别=4或=3跳出运算
( R2 c* r% j8 F, T& P4.3)"*"检查"后"面的运算级别<3或=4,则在相应操作数串上+()
$ w: Y/ s9 m2 m1 g$ W4.4)"-"检查"后"面的运算级别<=1,则在相应操作数串上+() 如果认为-(a-b)=-b+a -(a+b)=-b-a 则"后"面的运算级别=1或=0跳出运算
- Z2 W ]5 M4 Y' Z7 |5)第2,3次运算结束时这次运算的运算代替次序在他之前的运算的运算. Z" G# P8 O ?4 ~8 I
6)王成一个表达时的计算时应当分别保存特征马和最总的操作数串(完整的表达式串)在一个容器之中,已经存在相同的特征马则应该放弃现在的特征马和最总的操作数串(完整的表达式串)
" {( ^8 ?! q6 Q' b) x7)如果认为*1和/1是相同的则两者只能选一,(禁止(当...时跳出运算)*/1或/1中的一个)或(*/1或/1中的一个生成特征妈时转换为对方)' D# e4 b% S, S; ~3 N1 I7 N- L; [
8.1)为了避免6+3+2和6+(3+2)6+3-2和6+(3-2)...重复,"+"后面有"+"/"-"跳出运算1 b5 w' j D4 _7 ~' W! w4 x/ H `
8.2)为了避免6*3*2和6*(3*2)6*3/2和6*(3/2)...重复,"*"后面有"*" / "/"跳出运算8 [7 N% s0 o- J9 t
+ [( L) z1 U5 X4 }1 W. B b3 w一个特征马的存储形式:char[n,7]={{v1,o1,v2,o2,v3,o3,v4},...}
% h1 u/ V5 P" j( @$ _5 O, e& E% F3 D8 A+ R6 I2 p. i4 X
这里所有跳出运算都可以通过改变前后的特征马而不跳出运算,但是那样很麻烦
+ ]7 x. ?- s) ?7 j: C# D- z& [这个产生特真马的前提就是我的代码(规则是比较乱的)的前提,这里只是描述的相对清楚,特征马就是我的代码中允许的表达时的计算过程,所以我的这个铁自可能是多余的
. z) D" L) D) Z$ h: @+ u, g- M
5 z, M7 O b) c2 n( p
8 T; Z' A4 b3 P# a# X****************************************, L" Y8 z. [& E, G' A
例子1:
; h* X; T! Y$ ~# f8 y) F+ Y次序左右的63 {* A7 u* O& D
运算左右的=
" d/ F8 a% s/ v) N5 H( d省略了: f0 R6 [( N3 I
****************************************
8 j7 x+ I2 ~% x8 J/ Y( e T 操作数: v1,v2,v3,v4
1 i& o" ?, Y. z4 e运算次序: p1,p2,p3' @- L9 l+ E* m: [! W# }
运算: o1,o2,o3
, m7 Y! ?. U: K$ N操作数串: v1,v2,v3,v41 y9 P. U( Z6 O
2 |3 b& k. X- ?- s# I
下面是计算
7 D5 j- p" }& P% |: \ g* o1 B原操作数: v1,v2,v3,v4" _$ Y3 k C# p# `
一次运算: v12 ,v3,v4
/ W" i* `5 ^9 w8 s7 }1 V" r F1 G2 S运算次序: px,p2,p3
0 z, j5 g3 N) ` 运算: ox,o2,o3
' I2 W( f6 @, K- D" R1 }- q操作数串: v1p1v2,v3,v4,v44 u/ [1 ~/ t7 f* x
# h+ ^( Q9 Y8 m. s3 Y
二次运算: v123,v4
2 _4 H2 K; s. q( a7 N; L6 B7 C2 V运算次序: px,px,p3
( m/ d/ {: H% \% p6 g; P* M, h 运算: ox,ox,o3
+ V( a8 _9 @: {3 m( t; _操作数串: v1p1v2p2v3,v4,v4,v4
& r* l6 K" {7 X" H: k* F6 W8 h. V- ?# h/ u
三次运算: v1234 , ]7 s5 U3 c5 X3 @
运算次序: px,px,px
3 ^2 k2 z0 n$ Q6 M" K6 I5 ^ 运算: ox,ox,ox
. Z7 g9 d" _+ f- L操作数串: v1p1v2p2v3p3v4,v4,v4,v4' j' @2 y9 N1 \/ F% L
1 M3 `1 i8 N, _( `# U6 F( j! J下面是特征马
1 w' c' C9 A4 Y8 o6 \v1-o1-v2-v12-o2-v3-v123-o3-v4
" {1 o; H2 n2 ]这是按照p1,p2,p3的次序且v1>v2,v12>v3,v123>v4( g- h' M# z$ R/ ?$ B. b/ M
+ \& K Q6 k: {3 ~- j8 _
最总的操作数串(完整的表达式串)
2 H w! t6 {. R! w# U, sv1p1v2p2v3p3v4
e: {8 m/ s% O& z****************************************0 B# }! m$ r: `9 |9 u
2 @0 S, n3 ?& b4 b/ \5 N% U
- F% r1 @5 v( S5 ?5 n****************************************' W# n, X" D. v8 r1 F
例子1的实例:
) u- s# [5 j3 ~6 S次序左右的6
4 t9 Y6 {" S" [1 n' Z9 Q6 `- a+ k7 T运算左右的=) K: U* d: E* ]: X/ {. u" F1 o7 t
省略了
* m9 |- Z% y, w z3 |3 b****************************************' J& o/ I2 b* h) n
操作数: 2 ,2 ,3 ,2/ R# O3 Q6 @- f, M( H W
运算次序: 1 ,2 ,3
8 s% Q8 C! L' r# J! h5 X) j 运算: + ,* ,** d7 M( H# ]5 ^; a3 P. X
操作数串: 2 ,2 ,2 ,2
; G6 p$ B- B. E! @# d) o' \; F就是: (2+2)*3*22 s% H9 R/ Z: J$ B1 Z
! U' e' C0 J* N& J
下面是计算
; {$ h1 J6 A6 t/ P原操作数: 2 ,2 ,3 ,2
7 N7 O% q* H& H1 i+ [1 r一次运算: 4 ,3 ,2* b K" K1 q9 f+ l3 r/ j
运算次序: 6 ,2 ,3 , A, d! D: E9 k5 _
运算: + ,* ,* 生成2-+-2
" W( w# Z" o6 v& |操作数串: 2+2,3,2,2
2 m* X# ] L) p8 ] v2 T5 z/ X1 F5 D# S
二次运算: 12,20 k% ?, |+ \! d3 z
运算次序: 6 ,6 ,3
- B) c% U; r9 E; P4 d2 L 运算: * ,* ,* 生成4-*-3
/ _2 _! M' O; b. j" A. B' U3 \8 e操作数串: (2+2)*3,2,22 加上括号
& {. c& Y+ G z7 O f8 y9 ~) z( F
+ P& \* q* l; n. Y( f三次运算: 24 $ Y2 h" {6 }/ k4 C E
运算次序: 6 ,6 ,6 - m6 ]) \: x) U1 o& T5 I9 p
运算: * ,* ,* 生成12-*-2
* S; L A0 K# s: v1 y- r操作数串: (2+2)*3*2,2,2,2
- i* ~- j5 D' d. T
& q9 R; N( b5 y2 o5 U6 e下面是特征马
4 o. d) @% ]* t$ Q: E2-+-2-4-*-3-12-*-2+ V% H$ K8 m5 j! c7 L( m
按照1,2,3(就是次序)的顺序
$ \( ?) ?, J/ h% b' T! E1 E/ Q' f5 b2 D0 R
最总的操作数串(完整的表达式串)
. P0 ?4 u/ Y: j3 i. I(2+2)*3*2
2 x4 \6 C" I+ y8 H****************************************
7 C' u. {4 z+ \5 }: z& D5 e7 o0 F8 r7 @: T' F+ x
再比如2*(2+2)*3
# g0 t6 l& n8 Z) ~5 \4 x% y特征马+ T- A) M" g4 l5 [0 r
2-+-2-?-?-?-?-?-?
+ l2 `, R- M' {后面跳出了计算,这个特征马/最总的操作数串(完整的表达式串)应当放弃: y4 V/ |9 ]' c5 w1 E! \" `) H' F
和(2+2)*3*2不会重复& M$ }/ k: H M! D7 W5 ~
. x! D1 O1 @- b! k- ?4 X# T再比如6,6,6,6
% Y0 }" p1 y+ m9 ^' M0 j+ U可以生成的特征马
0 [. E# r# G/ _6 X6-+-6-12-+-6-18-+-69 Y t% I2 ]3 e$ S7 o& a
6-*-6-36---6-30---6+ A; \9 N2 y( _ j
+ ]# z) L' H. w再比如12,12,12,122 Y3 o' | l/ P( ^2 N' z* I5 |
可以生成的特征马) \+ s) ~1 Q* P& |
12-+-12-24-/-12-2-*-12/ [7 p1 J# U% i/ {) u$ K" F
12-/-12-1-*-12-12-+-12
% v9 J% n: n- _12-+-12-12-/-12-1-*-24# p, x9 M7 g0 Q! J
& o9 i1 \7 W A6 h2 _2 V2 X
' O0 Z$ g- h6 j8 u5 l6 r; c
( q* ?# P1 u. U( i9 i& m5 r! c, \6 z
) m( p5 x9 M) C+ j
0 x, W B7 U' b6 n8 ]" M) s/ M7 _. l( v
8 C; |0 t6 T: U+ Q) m. {
* A4 [' g) a5 s: ]! g6 h, k* j+ ~
$ m7 j& z# e r0 @; T9 M( w' G$ p1 T4 R, o" n8 V" N
8 L& W! r6 t i8 k
6 P; b% o) \8 J; W9 a[此贴子已经被作者于2004-5-12 19:06:09编辑过]
& Y3 ^9 W# A4 `! P# O; t1 i2 `
作者: 游侠无极限 时间: 2004-5-11 12:15
不太明白,比如8 p) [0 ]& @7 F) O k6 n& W
1*2*3*4. n9 I9 g4 p2 J; @3 I
2*4*3*1
v6 K. s5 c. C0 U, r# L2*1*3*4/ X+ d: l6 k# {, U9 a5 _. E+ g: K
2/(1/(3*4))$ i% B2 ]+ }+ f h
) z& p, c) A- w, _' R0 n
的特征码是多少呢
作者: 唐明 时间: 2004-5-12 19:03
2)检查前面 / 后面的运算,如果与现在将要进行的相同则继续检查前"面"生成的特征马的"后"面一个操作数/"后"面生成的特征马的"前"面一个操作数,"前"面生成的特征马的"后"面一个操作数>现在的"后"操作数 / "后"面生成的特征马的"前"面一个操作数>现在的"前"操作数,则跳出运算 (5月13日注:这规则是在前后都有计算过的运算时)0 M9 n# F- G3 E" |+ o
↓修改 ↓ (5.13.2004修改)/ o8 ^+ x1 Z# l" j+ V! E5 A
3)"+"/"*"作运算时"前"面的运算级别与现在将要进行的"相"同则"前"面的运算的"后"操作数必须是>=现在将要进行运算的"后"操作数,如果不符合则跳出运算3 u0 P% ~1 e* X
' P# z9 Y* J1 H, ~4 u7 q3 l4.2)"/"检查"后"面的运算级别<=4,则在相应操作数串上+() 如果认为/(a/b)=/b*a /(a*b)=/a/b 则"后"面的运算级别=4或=3跳出运算 (我认为是相等的)
; Q! g5 E1 f1 l) N6 p+ J! e
" d3 G. U% p/ n4 t+ }( h: [6 T8.2)为了避免6*3*2和6*(3*2)6*3/2和6*(3/2)...重复,"*"后面有"*" / "/"跳出运算
+ v7 c2 j; H, q7 ^/ s- q& t
9 \4 ^# Q) l' G( c. @$ X更见规则,你给出的狮子只有4*3*2*1是合法的,其他狮子舞发生成特征马4 Z H" u. ~" ?4 [+ t
4*3*2*1
3 F$ L8 ?- h$ ~; a" H+ |0 ?5 F次序:1,2, 3
. a! Q7 v/ h" T, k" r2 {运算 *(3) ,*(3),*(3) 括号内是级别; E; l, _6 w6 ]) h& @. Y ]
4*3=12 -> 4-3-3 结果12
# \2 j4 h& ?( n( s' T12*2=24 -> 12-*-2 结果24+ @& ?% l. ?; L: ?7 ?
24*1=24 -> 24*1 结果24
+ W9 v$ M7 ^! }7 k) T% V+ n ↓ ↓ ↓ 都是级别% @3 U7 L8 }3 N" R
最总特征马4-3-3-12-3-2-24-3-1
z: X, X0 j; }3 q' n2 ~+ ]7 V 4*3 12*2 42*1
6 |1 W4 }4 o( n, a* ^2 `2 L3 c; d; G8 F5 B& W
其他可以得到的特征吗(还有其他我原来里出的规则), n) v7 R& R. r; R
4-0-2-3-0-1-6-3-4 (4+2)*(3+1)
# C- I, x- w0 ^8 v3-0-2-5-0-1-6-3-4 (3+2+1)*4
2 ?$ k, ?$ n$ F( w: z1 T6 L
作者: 游侠无极限 时间: 2004-5-13 20:41
我想了一个特征码:
X, _2 U2 [! k" c7 L$ \取每个操作数所进行的运算符6 ~4 i4 t+ ]! @# P* ]" q5 B, j
即:# Z2 m" I# {/ E( {
1*2*3*4
7 }: k [8 ?* H g各个操作数进行的运算分别为:
5 ]6 b/ o8 l7 d0 E6 [ d6 A1 *
/ X& z3 u/ Z0 b( X! [% Z1 |. [2 *! ~# J5 ~ r' l1 f: N! V; ?# l
3 * S) b5 e I5 F' v0 d
4 * Q( o! \4 g( |# D4 t0 b: M
特征码为****8 p7 T9 f/ X5 {* X3 o# O, q, B
(1+3)*(2+4)为
" A$ C9 E( J* t1+: Q7 J: e2 i8 ?% L+ P2 d
3+4 ~6 ~% }# _$ k) I4 v( t
2+
- g6 Z1 s! |7 g' {: W0 V4+6 u- V7 n4 S% e$ \5 q, ]6 p; P
为++++$ Z/ I' S! q& K
2/(1/(3*4))
2 {2 j# d$ v- T8 j/ @: F1 k& S2/8 d1 U# \8 A3 Z, f: @
1/
6 T( c" n% X9 t) ~3*- X' {* p0 x/ ^, g H9 H
4*
/ m) D5 }- j3 U4 `, F为**//3 Z! E* a' ~9 U5 C4 G4 ?" B
隐含特征码为四个操作数和运算结果,因为相同,所以除去
* ~) k3 g: }. m1 X8 \' y目的是消除因加法和乘法交换率引起的重复
8 i( s4 b/ g+ z' e( n# h不知道有没有漏掉的,或者误除的
" p% T2 r V( n, U2 `/ q3 A0 n
7 p! |0 `0 ~1 w2 x; Z" @4 B, V9 H( |$ Z
[此贴子已经被作者于2004-5-13 20:43:35编辑过]
& {2 ^* w' e& G( G: q# {, `) R4 c
欢迎光临 下沙论坛 (http://bbs.xiasha.cn/) |
Powered by Discuz! X3.3 |