下沙论坛

 找回密码
 注册论坛(EC通行证)

用新浪微博连接

一步搞定

QQ登录

QQ登录

下沙大学生网QQ群8(千人群)
群号:6490324 ,验证:下沙大学生网。
用手机发布本地信息严禁群发,各种宣传贴请发表在下沙信息版块有问必答,欢迎提问 提升会员等级,助你宣传
新会员必读 大学生的论坛下沙新生必读下沙币获得方法及使用
查看: 9071|回复: 47
打印 上一主题 下一主题

有没有人想过怎么用计算机来实现24点

[复制链接]

该用户从未签到

跳转到指定楼层
1
发表于 2004-4-27 17:53:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
就是扑克里的24点游戏,4个数,+-*/得24……3 `; M7 e7 t8 U

% ~/ R  f, H4 R$ U  u" a: o偶还在想……
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 顶 踩 转发到微博

该用户从未签到

2
发表于 2004-4-29 17:01:00 | 只看该作者
电脑爱好者上曾经有这个编程的例子
  • TA的每日心情
    奋斗
    2015-9-17 00:58
  • 签到天数: 1 天

    [LV.1]初来乍到

    3
    发表于 2004-5-1 09:53:00 | 只看该作者
    穷举法吧

    该用户从未签到

    4
     楼主| 发表于 2004-5-1 21:43:00 | 只看该作者
    以下是引用yzhlinux在2004-5-1 9:53:31的发言:
    2 q6 G5 h7 Z% V# W穷举法吧
    - c8 ?; d5 C9 `. L" N6 b
    那你的代码要写P4,4=4*4*4*4=256行代码??

    该用户从未签到

    5
    发表于 2004-5-2 08:14:00 | 只看该作者
    256行代码,什么意思,就算是这样,256行算多吗??
  • TA的每日心情
    奋斗
    2015-9-17 00:58
  • 签到天数: 1 天

    [LV.1]初来乍到

    6
    发表于 2004-5-2 09:31:00 | 只看该作者
    当然不是的,穷举是用程序去穷举,而不是在程序里先举好,并且不是p4,元素显然不止4个,至少是七个如:A+B+C+D 就又7个字符了,而穷举就是吧A,B,C,D,+,_,*,\,(,) 这个十个元素来排列组合,组合成一个四则运算表达试,然后传递给一个计算函数得出结果,如果是24 则表达试就是我们要求的了。比如:
    2 N( z4 ~+ e  g8 z' wfunction GetMach(A,B,C,D) as String       '得到一个字符串组合如:(A+B*D)-C
    . D+ }3 @7 a  h! G+ l# ofunction GetValue(MachString) as Float    '得到字符串的计算值 ,可能是小数; ^* j- S  W3 g) |: d5 ^. @
    那么程序就好写了:. {2 u8 z' g" U  r- i
    GetNumber(&A,&B,&C,&D) ;    '得到ABCD则四个数字,赋给A,B,C,D四个变量
    + _$ S& }9 O7 K) m* j2 L% k$ zdo{# C& H; F7 W# A' Z
      MachString = GetMach(A,B,C,D); '得到一个表达试的字符传# u& {  J' e6 s4 h( S9 k4 {
      if(GetValue(MachString)==24) break;5 ?9 b# k$ L/ |
    }
    0 E2 P4 n& _: X/ x- U- b. Y# L; eprint XXXXXX;* ]( `" N1 j) M9 K3 U  v4 ?

    该用户从未签到

    7
    发表于 2004-5-2 11:57:00 | 只看该作者
    我现在试着在写,就是不知道有什么好办法解决重复的算式问题,比如
    , {3 R% U5 Q: ?4 y  D(5-2)*8*1
    ' @( \; _9 U* S% e/ L7 y, i( Z, j& A& U- ~& g2 {1 {
    (5-2)*1*8
    / E- p+ y% J$ o& \6 ~1 p! f8*(5-2)*1
    ; l& o4 _3 P3 D  y3 A; f等等
  • TA的每日心情
    奋斗
    2015-9-17 00:58
  • 签到天数: 1 天

    [LV.1]初来乍到

    8
    发表于 2004-5-2 13:17:00 | 只看该作者
    % J) r, o9 x6 t  ~8 _( u& g

    , r% I% J9 E& M  H6 B: f* B花了一个上午,终于完成了9 q$ ]. O8 u0 s( s* j( e
    你参考参考吧,哈哈, x/ n( n- @, [$ K

    / [' L0 O3 r3 P% ]) q5 s1 B+ A4 a/ m
    6 U0 k# P) r3 }+ n- \; F
    [此贴子已经被作者于2004-5-2 13:43:13编辑过]

    : }4 U/ w3 F, m: _, M
  • TA的每日心情
    奋斗
    2015-9-17 00:58
  • 签到天数: 1 天

    [LV.1]初来乍到

    9
    发表于 2004-5-2 13:42:00 | 只看该作者
    上面的发现有一点bug,
    % ]; ?& e' M& `. M) w. t这个改过了
    * z9 W' c( x2 M0 @" k" R一个计算 24 点的小游戏: f- D7 o$ i* m$ J' Y' b
    VB 编写* D3 C: {2 B! Z7 V# R
    # x" v0 F. Z, u& K8 X) P( C8 Y

    , Y8 I3 j9 o# K" t! E
    [此贴子已经被作者于2004-5-2 15:17:46编辑过]

    5 s5 k$ |5 U* Y$ U, D! |

    该用户从未签到

    10
    发表于 2004-5-2 14:41:00 | 只看该作者
    #include ' x- u7 |* p R4 f3 t: _#include t4 d( O4 r4 G8 }3 o, K % n; }/ N4 @# W9 k- O int EnumFormula(int min,int max,int num,int sum);3 e/ Z& G( r C9 ~- Q void ShowFormula(int *Num,int *Sym,int count,int sum); # y- W+ j3 D, `1 z& m3 J" Jdouble GetFormulaVal(int *Num,int *Sym,int count);6 a8 d; |: G: w# A* f int EnumArray(int *Num,int min,int max,int count);2 V& m% @! H- ^# B$ W3 o7 R. P void InitArray(int *Num,int min,int max,int count); p2 i! o: b* G4 B; h. Kconst char cSym[5] = {0,'+','-','*','/'};2 m7 L% \+ x; v/ M; @6 M2 u& E4 ] , ^% y; w! a; f" E1 D! Q1 iint main(int argc, char *argv[]) ) `" n2 ?7 h- k6 \2 O{ * p( d1 t" g t+ U0 f printf("总计%d个式子\n",EnumFormula(1,10,4,24)); 9 K O G8 c. u/ a. Y' J! r system("PAUSE"); ; {( h( W. t6 i: s- Y" F0 B1 S return 0;7 E. O$ A1 h( S5 [7 ~% M: w: V4 L } $ O$ z6 Z! C& v8 S9 V7 Q ' w0 k( R2 k; M+ e$ R; pint EnumFormula(int min,int max,int num,int sum) 1 p' J# N, a5 n8 D8 g/ E5 J! `- a{* c2 l" a! A3 h5 D9 n4 ~ int *FormulaNum = (int*)calloc(num,sizeof(int)); //储存操作数 / d Z: k3 N8 |* m; W2 t9 e* |# ?* | //储存操作符号 & ~: A3 B* l% i. v$ y //最后一位用于穷举结束标记 . G2 C- o/ R) \ // 1 - 4 代表 '+' '-' '*' '/' 6 c+ @9 w& j( x# |; |+ |8 E int *FormulaSym = (int*)calloc(num,sizeof(int));) O0 u) ~" p0 O0 Y( ^: a' X, |, y 0 U3 x& r+ m; Z4 o& P0 t3 R) P* o2 l int result = 0;/ A* L E0 e& T% H // 初始化操作数和操作符号数组, Q m# L8 c; A; K* g2 { 8 F0 Y1 G0 j+ s2 U" q int i; , O9 R/ U+ U, A) h 4 I" p% Q, s6 Z9 I6 Q! r, n5 y for(i=0;i = min; ( i4 q( a5 t. z9 h for(i=0;i = 1; 9 `' g! X5 H6 ]! w' q- q2 P FormulaNum[0]--;, g; i3 q! y2 ?/ W! y; ] 5 {& _% z1 `" t/ ^ InitArray(FormulaNum,min,max,num); $ D. j+ o! h& P% H2 T* o- \ FormulaNum[num-1]++; : T9 O2 B: I# T0 L, ?9 f7 M4 { // 穷举操作数和操作符号组合% L4 }4 S$ q, M' X s! }) t while(FormulaSym[num-1] == 1) ) p5 o. k+ Q: \- d& w {- b# K: _5 k& n% c8 g' V/ _4 p double t = GetFormulaVal(FormulaNum,FormulaSym,num) - sum;# z/ s/ d+ \6 G. [ if(t>-0.01 && t<0.01) / t$ }; y$ m9 K {; v9 \ \; {. t+ b6 I% ] //printf("%d %d %d %d | %d %d %d ",FormulaNum[0],FormulaNum[1], * L1 M: {! G' G( p //FormulaNum[2],FormulaNum[3], * }" ]7 Q$ Y# M; ?% ?# N // FormulaSym[0],FormulaSym[1],7 a% q" Z( H& r% n$ A( r# O7 C& [2 e // FormulaSym[2],FormulaSym[3]);9 h! v5 R; ~3 r- F9 j& K6 v# _ ShowFormula(FormulaNum,FormulaSym,num,sum);3 A& @& ]2 a# C# w2 j0 n result++;; W' r8 N- n- B6 ] }7 q0 s3 o6 @$ j: p ) d1 u. {) C$ W, | // 依次穷举操作数 / ]) W- y& E' q2 D& z& w9 B# [ 3 f! R* S/ Q2 T% m# l4 q- L8 W //允许数字重复的穷举 3 W: X' Q q" Y. ?7 {1 ?$ C; ] //FormulaNum[0]++; 8 b, t* X% D8 K( f //for(i=0;FormulaNum > max && i+ K4 R$ C2 {6 @ //{ ; g' {: s ^& O& E7 c7 p3 K // FormulaNum = min; 4 L0 c# S5 Q* m( x8 J: ~ // FormulaNum[i+1]++;) g/ L# u+ T4 g B( ^ //}# U3 A5 t% [' \3 X( b$ W // 操作数穷举与操作符号穷举联接2 m0 ?5 w* s+ u2 [$ D. j! { //if(FormulaNum[num-1] > max)! d6 N' t j/ y# h( Q //{ & _- |. C, Z( l) A2 ~9 ?8 ^. r // FormulaNum[num-1] = min;3 W& j% K! h( G* R) c // FormulaSym[0]++;9 G+ m6 k2 D( V6 R* b# e$ g) { //}: `0 Y. `7 m2 I! g2 e ' U. _/ p: ]! @- f) {) u9 f // 不允许数字重复的穷举 n2 x+ j! h/ O2 J4 K& t" W4 K5 ~! ^ // 数字必须从小到大的排列,防止重复# ?- H b- r! v4 S1 k4 ] if((max - min)< num) exit(0); // 出错 Z/ N+ W7 T% e9 y1 U4 n. Y$ }; t6 A# q$ y/ j- Y/ E if(EnumArray(FormulaNum,min,max,num)) $ R3 C% t) Z" e5 M% p; B, \ {. z/ W1 G7 W- u+ \. F" y FormulaSym[0]++;2 H# S) t3 r# n$ V% b0 ^ InitArray(FormulaNum,min,max,num);, N" T" _7 n) v, J1 T' i( \. x FormulaNum[num-1]++; W1 W7 r/ ?3 ~% B% Y; d } ' B0 b& h! c: h+ \4 ~ # q3 _! M! j! {* `4 A // 操作符号穷举 6 ?- f. t; B$ u, x for(i=0;FormulaSym > 4 && i2 q- b1 h' i/ _% U, S { ; A/ x7 J1 o9 j7 x! c FormulaSym = 1;, C* s# F' {) R8 v( {) M FormulaSym[i+1]++; 6 Z3 T3 B( }6 t. Q. H5 M } 2 ^3 H6 d, a5 o3 y: q9 d/ a 2 T( E% q8 J* {5 P } / P# m2 p% \, Y //释放空间 5 {% A ~& n" U7 c) Q% C( F free(FormulaNum);( p1 y0 f0 Z" q- I, W2 }$ z- e# {3 y free(FormulaSym);5 D# @$ {: y. T2 F- o/ o- G8 w' @ return result;' Y+ c. ^3 R: ?1 } } , v/ L* Q# |' Z$ K0 }& @// 计算算式结果 & F+ N4 i+ |3 ^* L3 Gdouble GetFormulaVal(int *Num,int *Sym,int count) ; v* |9 E! o9 w1 ^{ % x5 J( Y+ O* V D0 N$ { int i,j;. l! J8 H: r3 X. x' K double preresult; 7 Z) z6 u5 |3 K preresult = Num[0];/ l7 }/ v- G% @ i=1;j=0;( ?9 y% |' V2 w" Z% T* v2 g while(i# K3 W; @: v( m5 ^ { ) j4 `3 y% o& P. b; \, ^ switch(Sym[j])0 ?/ s2 u$ r: t2 W { 9 ]' u: n& `9 q+ M/ u% ]: \ case 1: % N, s6 t7 n) r- e7 Z- Z( N) J& V preresult += Num;3 ?9 A0 i. L6 h4 m0 [ break;, B S! \' w3 M0 y5 Y; I! r case 2: 1 F- P" m, x- |/ k preresult -= Num; 4 Y& F% n9 _7 d break;" s9 D$ T6 Y6 Q* r. R: U case 3:& f- v* O5 ^! M preresult *= Num;- S2 I9 E! D' G- J0 n' Q/ A break; & [; Z) h# J/ I& V case 4: ) X6 y- g2 f M9 W% [; S+ f& L2 @ if(Num == 0) return -1000;( `) Q( m- q. T7 y* R' m preresult /= Num; 7 v- J3 l0 k+ N! E* E& n, i' e6 E break; " g% o5 b! B9 R. K% t9 C4 A } 4 D) q) \7 e0 ?* n, H, f0 L- I i++;j++;, u' g" X% H: b6 U9 W2 N; i }6 r' S( R/ Y" _' T- P5 F3 a/ l return preresult; //进行修正 ! \! p+ r. M @ v2 X0 I' L g# Z}- q+ I# _$ P6 b // 打印算式9 n4 s7 T( \" W9 l% N1 I) \* I void ShowFormula(int *Num,int *Sym,int count,int sum)1 F. e( O9 c& c& }. S {5 @8 b( W7 h) Z. J2 N 4 N# b- g3 ^4 S" _ int i,j,len;$ `3 s: x% `3 s4 B) V, l9 W( T char *Formula = (char*)calloc(count*4,sizeof(char)); $ o3 d7 V8 c" u& x5 D [ char temp[10];1 g- j9 n) J3 m itoa(Num[0],Formula,10);4 A1 @" `% c4 n7 W6 [ i=1;j=0; , a* s9 r( |& S* u! T8 Z; \, e while(i& [. k" U& h8 j0 y' X( [7 f9 y { # r9 F/ r5 R/ H% Y/ {0 M, K; ? itoa(Num,temp,10);# w9 [7 u, ?1 \3 R' d( ] len = strlen(Formula);9 d' \3 k3 H) R2 M5 s1 l, K% M switch(Sym[j]) 4 s$ M' y9 j8 y4 T9 d' M5 x/ i { - o! V, r! j4 D K: H+ H) Z: w case 1:& E( b0 u# y4 Q; A case 2: " K0 P" Y+ |- t E! F5 `# [ Formula[len] = cSym[Sym[j]]; ) m8 J+ K$ \# w: r strcat(Formula,temp); u1 N6 y, ^: _ break; " p; @5 I& u& y6 ^6 x* C case 3:) U6 I8 D& E2 M: C% {8 C3 X case 4: 8 }' O" H$ m, k+ z/ L 7 b0 q4 B& I% V2 I // 如果上一个操作符号优先级低于当前的,应加上括号% Z4 f* z. z. g& V( \( U l if(j==0 || Sym[j-1] > 2) ) |. e) ^7 @* Z/ Q {3 |( Z" i' l8 a; K6 d: f. @ Formula[len] = cSym[Sym[j]]; 3 J/ z2 p# Z6 Y5 M5 ~* A& _, ] strcat(Formula,temp); ) @$ N" N' {# k2 `& S7 k } , r8 P! c/ Y+ ^. M4 s4 P else ( |; E! s+ N/ U' ?% ~ {7 p! d i* @1 n. l+ \# `/ ^' r int n; 3 n# R4 k% Y! F& D* { char *FormulaTemp = (char*)calloc(len+1,sizeof(char)); % g/ Z. h0 Z- W9 u for(n=0;n1 B+ }6 o& O. m# N9 c4 s# k0 p { - @2 ^! `# |1 l- a5 k4 d FormulaTemp[n] = Formula[n]; 8 P3 q) ? j2 A9 ` Formula[n] = 0;$ ~0 ~/ E/ k! w% Y+ g } q5 _2 ]& Q8 Y$ h4 Q& F( j Formula[0] = '(';# |! B4 c; M s% O6 c: N strcat(Formula,FormulaTemp);% _ E9 a7 ?* |8 g6 D+ K* C' K free(FormulaTemp); ( F6 d; M6 [; t* U, \ Z Formula[len+1] =')'; # L2 g8 O, X; o+ O8 J+ h8 S( Q H Formula[len+2] = cSym[Sym[j]]; 6 @4 Q7 N" N- S9 t( e# l1 A strcat(Formula,temp); / h( h; N8 Y8 O5 D' ~ } ! v: g& w5 A3 Q8 @ break;$ L% U0 D, E2 P9 C0 ^4 y, x" d1 ^% T5 A } ( d3 n" o, E7 U4 A0 }0 o6 Q8 ?0 d, S i++;j++;2 o$ K* u7 o' j5 w$ t, ]4 |% J }, U; u9 p: `% \9 x; ] printf("%s",Formula); 9 m9 O- L) z/ T0 ^- E- w" `# e$ v printf("=%d\n",sum); H5 M5 b. J0 E3 ? free(Formula);' E$ E9 y' U) Q) P; _. m }8 E2 d3 w! T1 G; G& t7 J. J # [7 ?7 Z# K. U4 c# H6 {# T7 F // 以当前数组为基础得到一个从小到大排列的数组$ C" K" F7 m+ ?7 ~ H5 C1 G9 G // 返回非0表示穷举结束- w3 i+ L8 s' {! O, }2 \ int EnumArray(int *Num,int min,int max,int count) 8 d1 {" N. W" ^# c/ l/ x{ $ B# c+ G6 w- R, ^( s int i,top;8 G1 o7 \% W: ?# W" p top = count-1; * l c8 s9 W4 m, @ Num[top]++;. }5 U, J# {1 A; c6 R& r/ i0 ]. ? while(Num[top]>max-count+top+1 && top>=0)+ h" r) }! O! F6 |! A {( y- O8 v4 s5 l/ m: N top--; * u" s% n0 i6 T6 k/ _ Num[top]++; % {4 U- I. D8 ~+ j } 2 _) m" F) x5 O: x for(i=top+1;i% v6 k2 d- N! d% r) T7 g {) z v% v' q! ] Num = Num[i-1]+1;1 L) y6 i4 u0 m0 X } % P4 \0 b/ |1 t if(Num[count-1] > max) return 1;: u3 l7 S+ [5 e% u; y5 Z( k9 q' F else return 0;: o& l" f6 \! n c }: l7 s+ q$ ^& f( O 6 u" m6 k7 ]3 L// 不允许重复的初始化数组 i, v; N$ D5 L3 D void InitArray(int *Num,int min,int max,int count) 4 O+ o3 \8 j- I- y' z: G{ 5 f7 {8 r Z& _1 w! c int i;8 c3 @) k( `1 E' y$ @0 k! l5 k for(i=0;i=min+i;5 `7 D( `: T# c; y: r' F9 @ Num[count-1]--; 1 S3 h- W- x) p( c7 l. S$ l} $ {9 _% ^- m/ \+ {+ H; O' Z" s ( m% ^: J/ n- {( K) O$ `; S. Z0 T+ \ P: |# J/ }( u% E+ l0 ^, x. w 5 Y6 G; _. {2 F; |3 T
    [此贴子已经被作者于2004-5-2 14:50:47编辑过]
    . c. c3 ^5 j N" r

    该用户从未签到

    11
    发表于 2004-5-2 14:54:00 | 只看该作者
    本法穷举出所有用min - max之间的num个数组成算式,结果为sum的情况
    4 d6 s3 V( e/ V8 n9 d# e2 W1 e2 ?" Z
    如要具体的话,可以不穷举操作数,直接输入操作数,进行操作符号穷举
  • TA的每日心情
    奋斗
    2015-9-17 00:58
  • 签到天数: 1 天

    [LV.1]初来乍到

    12
    发表于 2004-5-2 15:17:00 | 只看该作者
    以下是引用游侠无极限在2004-5-2 14:41:26的发言: f7 d. W) t; F) V* p; l/ A3 u$ W#include 8 K7 E' N+ D! C3 h #include , w: p8 ^/ _- n. F( f; ? " y% e+ @/ P" v int EnumFormula(int min,int max,int num,int sum); 5 U3 P3 u) T" y# F5 H% U' H void ShowFormula(int *Num,int *Sym,int count,int sum); ) w- E( M4 T' C" W double GetFormulaVal(int *Num,int *Sym,int count);" u9 l9 X1 i7 ~5 V& d int EnumArray(int *Num,int min,int max,int count);( `" v/ E8 G0 R. s) l+ Q void InitArray(int *Num,int min,int max,int count); ; l/ K. g- n3 F; c const char cSym[5] = {0,'+','-','*','/'};. g6 A1 Q: \3 @' e% \; m R6 ]$ E( q6 |- H8 P2 w int main(int argc, char *argv[]) ' O# ^6 a) S9 `8 D; r4 j { ! E. N% ?/ ]" ]( d& ? printf("总计%d个式子\n",EnumFormula(1,10,4,24)); . ~7 m1 g! f% \2 K4 ?+ K+ U. i* J2 e system("AUSE"); , N6 P9 Y3 [9 @1 K4 v* c return 0;3 C. g7 `' }4 h9 l: t }4 X! K# j1 R: B W/ Z9 b% a 0 f% m4 Q3 C+ d int EnumFormula(int min,int max,int num,int sum)) F- @: n- \1 z) \4 _ {8 j, q, q. z7 N5 n/ t int *FormulaNum = (int*)calloc(num,sizeof(int)); //储存操作数 ( j1 L9 n8 D: s" r @( B //储存操作符号 2 Y+ b3 L, D% ]- O$ q: [ //最后一位用于穷举结束标记6 j8 I7 ^+ x2 z. L+ p! w8 j // 1 - 4 代表 '+' '-' '*' '/'1 n& v- f7 |/ Q# r2 S int *FormulaSym = (int*)calloc(num,sizeof(int)); : p0 o0 R- |3 N , m& T7 t: j7 o( d x) U3 s5 p int result = 0;. t/ N& n- Z' j# c8 Y5 a% x // 初始化操作数和操作符号数组 " X& J8 X3 Y% f& I H " b7 v. j( A% {* G7 Z8 `" F8 U3 O) O! ] int i;6 R. g' t: p; Z # Y$ k" X) g3 s6 o7 F& i9 Y for(i=0;i = min;5 n# V8 d! F6 B1 Q for(i=0;i = 1;4 b" W4 p% J/ c$ v FormulaNum[0]--; , p6 M- p# S4 V# t( g4 l8 [& N& `2 l" B' p InitArray(FormulaNum,min,max,num); m/ Q G6 @/ {* C6 N* \3 d ^: @5 b FormulaNum[num-1]++;' V7 E V) s' F8 J' W2 t9 r // 穷举操作数和操作符号组合; ?4 d, V6 w2 U# e9 s# b/ z7 n! T while(FormulaSym[num-1] == 1)% q9 d& c- b- _2 p# n { 8 V! a, ]1 b& }! ]0 c6 L double t = GetFormulaVal(FormulaNum,FormulaSym,num) - sum; ' w4 B* X2 {' @) u) F" A$ A4 ? if(t>-0.01 && t<0.01) 1 \6 {: m5 f( n; l {4 @/ @0 ?1 \$ L3 z4 E( Z+ [* [ //printf("%d %d %d %d | %d %d %d ",FormulaNum[0],FormulaNum[1],4 m& o) ^5 i+ C$ s8 [& [ t& ?; x8 V //FormulaNum[2],FormulaNum[3],- T0 e) o3 n' J0 m // FormulaSym[0],FormulaSym[1],' |$ |/ F3 o* D // FormulaSym[2],FormulaSym[3]);" Y, x" w: [+ S% s' [- \$ f2 b ShowFormula(FormulaNum,FormulaSym,num,sum);+ h8 d8 ^# G7 J% h result++; " m3 s/ S* y4 a( d- w& ~ }, E& l' ^6 O, L+ h. v : m5 u* K2 J( I% |# y2 m // 依次穷举操作数 0 V2 s1 _- T4 r8 z* F- _0 z' l8 x " ^9 y. V& v; r0 e5 T* g- m- ] //允许数字重复的穷举 4 Q. x g6 Q1 V$ _, @3 ?% ?( z( U //FormulaNum[0]++;/ _2 C% u" D1 ` //for(i=0;FormulaNum > max && i 2 ~6 D# x: F( v, O3 Q //{ , N ~; L* k& S5 l, k; m // FormulaNum = min; " d! v& n% G( R/ {) h // FormulaNum[i+1]++; & y4 u# {) U; _6 F9 e3 c% ] //}* K4 C( b6 D' f7 {% m4 e8 [, s // 操作数穷举与操作符号穷举联接8 f( x4 } S9 }: G j/ p //if(FormulaNum[num-1] > max) 1 x9 \: b) U' Y5 p" }. K1 ]6 a //{- K; u1 \. a2 g6 S // FormulaNum[num-1] = min;+ Y" g7 N1 _$ S& Q // FormulaSym[0]++;4 l& a) M7 {, `* B% z+ E, v" s# B //}$ t0 }* m+ b8 z4 @8 ]9 E & s4 \5 i2 b6 [7 `$ F+ V // 不允许数字重复的穷举/ w3 s% m* `, m. i // 数字必须从小到大的排列,防止重复 & [' |% u# q: L: U if((max - min)< num) exit(0); // 出错' m2 b' q% n( ? & ^0 u4 Q/ E& z B8 Z* v+ ^ if(EnumArray(FormulaNum,min,max,num)): s8 J! |0 x4 ~ v/ f* }- C {' `! X& a/ q9 o" G+ n) I# D( j. ? FormulaSym[0]++; 4 _7 u! S' t' }8 K: [- \+ W8 Z InitArray(FormulaNum,min,max,num);, X! D: r4 `1 ^5 |+ s FormulaNum[num-1]++; # W2 I5 k, G) N; b" k } ' U5 Q% r8 s: p5 ^( I; [: a& H 8 s7 p1 t6 x5 `5 L; ]* c // 操作符号穷举 0 ^, u1 _5 j6 C/ `. ] for(i=0;FormulaSym > 4 && i2 w- n, H; _: t' ]0 r; t { " L, h) i5 S- w; A9 t% \ FormulaSym = 1;. G& Z, ~# j7 j! n: t FormulaSym[i+1]++;( R- |0 ?2 r% d }1 m; X( H2 X" d# q& |7 n % t& M# n Q( v- S' G8 I H/ z } w+ g1 a/ O, q6 M7 k/ S# B- B( R& D //释放空间. F/ H1 ~9 }: w; z free(FormulaNum);; c0 O- T2 O) z free(FormulaSym);6 B5 P8 E* r, s U4 X+ b8 [ return result;5 o& A- |8 R$ e: U }7 M, `: \# _& Q2 H! p9 g // 计算算式结果 9 j8 ]- x; l+ P( A4 v* d `$ [ double GetFormulaVal(int *Num,int *Sym,int count)$ M$ b$ }! X9 O9 O { 1 U0 d D1 b6 G# r" D int i,j; , X: F) ~4 X _$ W. ^: d double preresult;) S; R8 E( `! u s; A% U, @& Y preresult = Num[0];* p# W8 ^" w: |8 O8 m8 i3 S0 g i=1;j=0; : E; C7 X7 Y. m) Q, ^ while(i, A, p! g% }3 d1 ? {: i+ e0 i* \) a. K% ]& T& V4 r switch(Sym[j]) " q9 w0 t3 F5 K! S) _" \ { ' i0 X* l0 x/ t% A" J' l" G: f case 1: 6 P: A3 S' a- _. [ preresult += Num; : x* m2 f9 _; X Z1 I9 U break; % {# L% z# i. X Z case 2:2 e+ K7 u, z1 v/ j# O preresult -= Num; 3 ~) ^! s. [/ i! a( l2 h- G break; 1 a! H% V, F( {+ a! r case 3:: |( g+ ^/ @ o" Q/ h8 s; h: T preresult *= Num; , \6 a" t5 b7 ^& I' j8 B7 @ break;) [8 |% [+ G% B case 4: 0 Y8 I$ E- S9 |" B1 P* h. ~ if(Num == 0) return -1000;5 I ^; D& X& D( ], r) P preresult /= Num; - y$ [0 s1 R B) ~2 s3 n. m break;5 W& ?& E& _( y- b4 J1 o } 1 F. Y" B$ m, f i++;j++;7 ?, K q' E$ k1 t2 \ }0 F u8 |4 [: [( K# s* c' |0 J9 ^ return preresult; //进行修正; u8 F* v f4 G9 i, @; ` }& @2 d, l- {8 g* d- x8 P( }# d // 打印算式2 `- B. g4 o* O0 t; w/ r( I+ _& p void ShowFormula(int *Num,int *Sym,int count,int sum) ) ~6 p- E4 B5 x2 {6 o {: }- T+ a# \+ | 7 `% E3 y6 \: G4 C' J2 c# F int i,j,len;8 I W- B- B/ Z2 n char *Formula = (char*)calloc(count*4,sizeof(char)); . O6 f+ j$ [. H$ R3 E9 P8 o char temp[10];: o( D) r4 y/ Y) v itoa(Num[0],Formula,10);+ J+ Y; [! |, `: B+ J! \ i=1;j=0;7 }/ R4 U7 L$ `% i! f) p1 e' j while(i5 ?% Y) }% L! ^" k- V {+ u- O& z. q4 H& | itoa(Num,temp,10);4 W# q# p: `/ w1 c& {# _ len = strlen(Formula); # J& R. D6 m U switch(Sym[j]) " T0 \2 J r# _5 Z6 P: u) M- y {5 J8 k9 _1 h7 s6 o8 g" E case 1: + O+ q1 o. ~1 P case 2: ' j* U' M# N& j' ]7 ?$ g Formula[len] = cSym[Sym[j]];2 g" y% G! J5 S% _9 l, { strcat(Formula,temp); # K/ q w0 [* I, D, P- q break; : T& b! {9 v5 i1 g8 V& w7 S case 3: 9 a# a9 g; d. A* q8 H case 4: * u$ V% i. r8 l0 ~% N1 a# o7 D; [ + J2 Y; t4 j) ]' B- a/ X2 d // 如果上一个操作符号优先级低于当前的,应加上括号 ' T6 l# ]: X3 O& I4 _5 E0 r: H if(j==0 || Sym[j-1] > 2)* M+ v) i3 _# H0 l { - D9 u) |$ C, @6 ]! _: h5 Z Formula[len] = cSym[Sym[j]]; 4 p1 r) [) j+ V* c. J# N+ W( M strcat(Formula,temp); C* y/ m& ^6 r } + n& i( E2 C) ?/ x' Q V7 y" K else # T! M3 s- x2 k8 r9 _8 z+ S { ; ~' I W) v/ {" \ int n;# J; m" |8 J( i" \ char *FormulaTemp = (char*)calloc(len+1,sizeof(char)); ; D, F' n) Z8 I' m3 G for(n=0;n, T3 x& a/ l) R- x4 ^ {$ ?! m1 Q+ `1 Q% a) Z" q FormulaTemp[n] = Formula[n]; 3 J! @0 F9 n0 N. h9 j* y5 [- [% @7 y Formula[n] = 0; 4 m* m; m* y9 U5 c5 @0 p }4 o: T' g. z' F- y* x5 { Formula[0] = '(';2 G3 L q. {! j# ]4 U9 a strcat(Formula,FormulaTemp); 8 P3 g) p" S1 f$ k; Q free(FormulaTemp);. @9 I; E! f1 \( u Formula[len+1] =')'; w; p! o3 Q, K1 Z' k7 p) u& _ Formula[len+2] = cSym[Sym[j]];$ j8 V: c4 h2 k2 _& M strcat(Formula,temp);; I Z0 U2 \4 y ?- K! ^' [ }8 p$ s; i. s8 o, { break; . n% m4 _/ H: F2 C( s. Y } ( H# p8 ]) K& d: ?' Z i++;j++;, W V- d) t3 \4 j3 B# Y } ' z. J9 B1 {( N( J$ j printf("%s",Formula);3 i* e% L. P" v" q5 a printf("=%d\n",sum); 2 }' V: ?& G; R' p free(Formula); 1 r! r: P( P9 `- n" m }' {# o' H6 B# o, l5 y e 5 E: @; [" h8 }8 G- S // 以当前数组为基础得到一个从小到大排列的数组1 {) W. a) o) t // 返回非0表示穷举结束$ d X [1 Q- _2 g int EnumArray(int *Num,int min,int max,int count)% G, ]4 h9 I. L4 K5 P/ o { 4 t, V4 T* a1 |. d' S E9 c# | int i,top; , C, t7 b" W( i3 r top = count-1;( q& l/ R+ F* `% F8 F Num[top]++;& m5 x% e# U9 j1 J( I while(Num[top]>max-count+top+1 && top>=0)* E: ?+ ~+ @/ z) c1 @/ [2 K {4 F% |2 V3 k3 k top--;4 \2 R2 Q# V2 k) u# l9 R Num[top]++; 8 q9 n4 G5 H' [- o }# H9 i6 x5 u3 n+ T: u- @$ E for(i=top+1;i' Z" O: t' v! v6 Z( e {' k* L& ]# M7 r1 S1 E# B4 W: F Num = Num[i-1]+1;6 b0 x+ D Y" h- B' Y+ m: A3 Y }8 ^/ s. v$ Q+ m7 ? if(Num[count-1] > max) return 1;" q7 X% [$ h9 V/ A2 e% d( w else return 0;+ O! R( H* W. n }+ d- Y' T4 r* G7 D1 _ " C8 R. F! v. y* j // 不允许重复的初始化数组; x l/ j9 O/ Z, ~8 i" k void InitArray(int *Num,int min,int max,int count) * k: q& D) Y2 c: a6 ]8 L8 y E& u0 \ {4 K% Q5 m1 ~ _# c( h/ a int i;: b/ j* b$ ^" F" H2 F% a/ s for(i=0;i=min+i;% p# Y! n: d- b- Y! R) B# C Num[count-1]--; - A$ C2 z$ C' b6 f } ( j. K) S9 n* l+ n9 D! M- j. [! h 7 ]/ d- c7 K0 P! `5 A4 H4 {! P% k5 N# A 1 E. H9 }5 \: ?' t" r
    [此贴子已经被作者于2004-5-2 14:50:47编辑过]
    8 ~$ S8 K% G" r' A* b: R+ | % F) r! i9 p& z8 jprintf("总计%d个式子\n",EnumFormula(1,10,4,24)); 的运行结果是: ' E, k% D/ S6 R. r1+4+9+10=24, P$ ^0 p+ G9 W 1+5+8+10=24 % c; q; O y9 k/ W, V- _. b+ y1 h1+6+7+10=24 ' R. L6 s) P' {3 M1+6+8+9=24 # j! w) Y& o6 m- W8 u2+3+9+10=24 : h7 _# h! F$ y. g6 W2 |+ p2+4+8+10=24 ( T- `0 a. W6 F2 ~4 C% ^2+5+7+10=24- g) s" w$ U. h& r5 x) V 2+5+8+9=24; o" j8 f0 d; z7 u$ t 2+6+7+9=246 |3 t% I' j, K( R" f 3+4+7+10=24 2 P* N+ E" z& _6 b3+4+8+9=24' `9 o4 Y7 ?* X, e5 I/ f 3+5+6+10=24 3 B9 t; m1 M6 R) Q; E0 F7 l) H3+5+7+9=24 3 W" N9 b& B2 T! \% s$ p3+6+7+8=24 $ E& F9 v/ H# T; E4+5+6+9=24 ' y* y% G; z& {- W% l4+5+7+8=24 ( r0 X* Q) y( p这是什么意思?似乎是找出了 1 至 10 之间的和是24 的数据,这和完成计算24点,差很多吧? - H7 T) }4 V& Y0 w比如用户输入 2 ,5,7,8 程序应该能得到计算这四个数据得到24的表达式才行啊,这样就可以写一个游戏了。 : R6 e `) }8 d( [& u& M0 n. @! S如: 1,5,7,8 有如下方法可以算出 24 ! a, ]! \) }; }2 o& v((1+7)-5)*8 = 24) i8 ]! l! F4 Z& c* s0 ? ((7+1)-5)*8 = 24 - A+ {& z9 T, O4 ?(1+7)*(8-5) = 24( ^- u" j% j; | (7+1)*(8-5) = 24 9 ]1 u% V% _: E7 n$ T((1-5)+7)*8 = 248 F) Q+ j4 O" F) y4 T4 f9 J& h ((7-5)+1)*8 = 244 P- i& f) i7 }' Y% v: K3 F (8-5)*(1+7) = 244 z- f3 w3 d$ p/ w (8-5)*(7+1) = 24- Q v% p* \1 r' b- A/ B" S 8*(1+7-5) = 24 / ^6 V" e% q! D& C3 o# s8*((1+7)-5) = 24 ' z7 ^/ D3 E6 P# f" z& G& Q( b+ q. p8*(1+(7-5)) = 24 5 u1 s/ v+ D( L B0 l8*(7+1-5) = 24 ) P+ L( |/ q2 U- l" e8*((7+1)-5) = 24 % H& Q6 r+ c! J8 |3 k8*(7+(1-5)) = 242 @( t5 @1 s$ Y( f5 `4 M 8*(1-5+7) = 24 , U% }7 @# `1 L% K, s8*((1-5)+7) = 24 y% j- N. y7 J& E& v0 y7 M2 R: J 8*(7-5+1) = 24 . l# @* r9 @2 v+ |; s8*((7-5)+1) = 24 9 X8 x8 W8 x j& L) n8 y# w

    该用户从未签到

    13
    发表于 2004-5-2 15:21:00 | 只看该作者
    结果是这样的:
    / G: d3 P' F6 J* c* s, S) B1+4+9+10=24
    - `7 @( ~$ `/ L7 V) r) ?6 V% L1+5+8+10=24
    : k; O5 o% T2 G1+6+7+10=24+ z5 Q. q4 S; _7 u' y+ d6 _3 B' B
    1+6+8+9=24
    ( |' ^6 G: V0 Q2+3+9+10=24
    % }/ J  B: U8 p2 |' i% r: s2+4+8+10=245 y1 Z1 @6 ^/ X1 o& {3 r
    2+5+7+10=24
    : U) g5 z% R# x! _. P$ ]2+5+8+9=24$ [" V  E1 l% \" N- W7 L7 B5 H
    2+6+7+9=24
    1 V! X7 x/ Q+ s' r6 k# i" Q1 p0 \3+4+7+10=24
    * [% c- l( |. [1 b1 ^3+4+8+9=24
    , {: ?4 f6 I5 {, t+ ?1 _3+5+6+10=24
    0 W, N! I7 [1 V8 }( j, g, E" }3+5+7+9=249 S0 p" p' U& D/ p- q4 v
    3+6+7+8=24
    % D1 v' [2 m( ?  d4+5+6+9=248 ^  z7 K3 ]3 [$ v( B$ P
    4+5+7+8=24
    + X) @) i, u3 x( m3 X! H1*5+9+10=24
    & r$ N& [( Z. b! o: ^1*6+8+10=24
    # Z% a: r$ I* U, n& P1 s6 `1*7+8+9=24
    3 J# R: y! r  J2*3+8+10=24& S' W3 D6 }  G7 Z; i8 y
    2*4+6+10=24
    ' f& e, a: O0 j2 H1 W- G) d2*4+7+9=24
    : \  H/ \! F" O# h* m" X2*5+6+8=24
    6 u7 q8 H1 e: b( n5 y* y3*4+5+7=24  Y0 ?* u$ c3 k' e7 M
    4*5-6+10=24
    % C0 B' ?! ?5 w; I7 ^2 e1 ]6 g7 Z(1+2)*5+9=24- W$ B3 v& S0 R3 ^- k2 z4 r: Z7 |
    (1+3)*4+8=242 c9 x4 T6 W$ z# Z1 f$ e4 `
    1*2*7+10=24( v' i( Q% m5 R9 T1 D
    1*3*5+9=24
    ) ~0 [- u8 ?0 {* M. b, Q  x6*7-8-10=24
    ( l2 c& p* }" ^0 @; z(2+4)*5-6=24
    6 p: D" ?, O- J* ~- g1 O9 L2*3*5-6=24
    2 ~! S" I: ?; U% H+ k8 V. H(1+2+3)*4=24
    ) Z* X9 [5 K4 t" e* p* f2 o' t/ r(1-2+4)*8=24
    ) P: s! }' `3 C& z(1-2+5)*6=24, T; ^" Z+ g6 m7 x1 u
    (1-3+5)*8=24
    5 E  p& E+ H  t& ^1 i1 ~  s(1-4+6)*8=24
    7 F: `$ d7 d1 A1 A' r(1-5+7)*8=24
    " \8 t( @* [5 L(2-3+4)*8=24
    6 k' Z( r6 R9 A4 f* c" c0 Z(2-3+5)*6=24. [- D& {6 V4 A% m9 g  B% n
    (2-4+5)*8=24
    ' W! R1 J0 L6 n1 D(2-5+6)*8=24
    * d0 M, ?0 D$ A* u% _* s6 n(2-6+7)*8=24
    / N1 z  j5 `% V9 d+ \- r(3-4+5)*6=24
      C+ q  N$ u! N0 _+ u(4+5-6)*8=24# o2 `7 N" I: P
    (4+6-7)*8=247 s3 p# G; O: d( n3 a' [, u1 Y
    (2*4-5)*8=24( W7 J& p" D' l5 ~5 z
    (2*5-7)*8=24
    / ~* H: L0 Q7 y9 g+ m* i' f8 w1*2*3*4=24+ }7 K! w0 M( V, P# V. ~6 T
    1/2*6*8=24
    8 }2 ~2 |2 d1 Z4 }: \1/3*8*9=241 O1 q/ Y2 ~8 H/ T" n8 b  d
    2/3*4*9=244 ^8 S1 }2 U( [# o
    2/4*6*8=24
    ( ~9 a" A! d" a- s4 M2/5*6*10=242 p! P/ f8 ~5 _( X  h- B3 n* `
    2/6*8*9=24
    ( Y+ Y  @) v: X& N0 j, e3*4/5*10=24& i6 s2 }; J' p& x; k4 t3 q2 [% a
    5*6*8/10=243 J( }8 J' m* i) O% o4 k2 Q! ~. m- l) D
    总计57个式子

    该用户从未签到

    14
    发表于 2004-5-2 15:22:00 | 只看该作者
    当然不会只考虑加法的情况,大概你复制的时候出现问题了,你可以下载这页最上面的那个程序0 `9 N; ]7 [/ W- O' Z
  • TA的每日心情
    奋斗
    2015-9-17 00:58
  • 签到天数: 1 天

    [LV.1]初来乍到

    15
    发表于 2004-5-2 15:23:00 | 只看该作者
    to  游侠无极限  ! ]6 @* T- @6 G# @3 t2 k9 ^. f
    你的方法思路比较特别,不过似乎更浪费资源啊,如果范围是1,100,那么你的循环将更多,而目前只是 sum 的,如果加上有 -,*,/ 和括号的话,那么就更多了,并且,如果游戏中规定可以使用三角函数,那么你这样就无法穷举出来了。. Z: G2 L7 z9 w& k. J" [9 s! g
    参考我的代码中,由于是组合成合法的表达算式后在进行计算得到结果,判断是否24,所以对于符号的增加和三角函数的支持都很简单的实现了。都变成了字符串的组合而已
  • TA的每日心情
    奋斗
    2015-9-17 00:58
  • 签到天数: 1 天

    [LV.1]初来乍到

    16
    发表于 2004-5-2 15:28:00 | 只看该作者
    (2-1)*3*8 这个算式你就没有啊,这4个数字的组合都没有出现5 o" H( P7 z. B5 v- c4 S1 W
    & v" Q' h3 a9 ~3 i0 v" I! I$ s
    * t  |- m+ P3 Z7 L6 z! \) z% a
    . r+ Y" r$ r6 P0 }# U& \, w% ~

    * n8 w+ l+ ?9 t/ b( V- g, c) I# `" @0 Z. C
    8 X7 l/ g( L0 j
    [此贴子已经被作者于2004-5-2 15:32:12编辑过]

    * e: _% ~/ T, v: r. ~- t  a
  • TA的每日心情
    奋斗
    2015-9-17 00:58
  • 签到天数: 1 天

    [LV.1]初来乍到

    17
    发表于 2004-5-2 15:28:00 | 只看该作者
    似乎少了很多算式
  • TA的每日心情
    奋斗
    2015-9-17 00:58
  • 签到天数: 1 天

    [LV.1]初来乍到

    18
    发表于 2004-5-2 15:29:00 | 只看该作者
    另外,玩游戏的时候应该是可以重复出现的,不规定4张牌都必须不一样吧。

    该用户从未签到

    19
    发表于 2004-5-2 15:35:00 | 只看该作者

      @8 T( s7 @4 U' S9 Q) m
    : h8 q  B) I7 o0 T用这个好了,只不过输入的时候要按从小到大
    * R0 U0 `( a) g! Q! o4 S# |+ {, @5 y7 d0 m- k
    好象有BUG,我暂时不太清楚

    该用户从未签到

    20
    发表于 2004-5-2 15:38:00 | 只看该作者
    以下是引用yzhlinux在2004-5-2 15:28:15的发言:9 E* x* E' e: e6 V2 O9 p
    (2-1)*3*8 这个算式你就没有啊,这4个数字的组合都没有出现

      g: P3 b1 T( c( v1 D+ D# _0 w) h% P  }
    本来为了防止诸如1 u  z2 h0 w$ h
    1*2*3*4( _1 _1 U2 j5 u! m! j) L* ~& L
    1*3*4*2& Z0 o/ {( o( c6 p! Y( r
    2*3*4*1) a. n! t: o" \1 Y
    等的重复,只使用了从小到大的数组,不过这样好象也丢了不少可行的式子4 F" ^" s" F0 A
    " c, H1 Y$ K; k0 ~. B
    另外你的程序就是有这些重复的
    5 {7 j+ v4 W3 Y$ q1 g: D( d- G. B, Z. t0 U4 K  l  Z
    PS:VB的程序感觉就是慢好多啊$ }- e+ K3 Z! x6 x/ j' A0 [5 j
    [此贴子已经被作者于2004-5-2 15:42:01编辑过]

    4 K3 M; J+ {  F7 o5 Q- g9 ~

    本版积分规则

    关闭

    下沙大学生网推荐上一条 /1 下一条

    快速回复 返回顶部 返回列表