下沙论坛

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

QQ登录

QQ登录

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

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

[复制链接]

该用户从未签到

跳转到指定楼层
1
发表于 2004-4-27 17:53:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
就是扑克里的24点游戏,4个数,+-*/得24……
0 V$ Q; b6 ^* {4 b& f/ z
( c8 ^* r0 V( y6 M* A( b偶还在想……
分享到:  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的发言:& H/ f# Y+ ~9 p( j, ]5 Z
    穷举法吧

    * b/ p$ D+ E9 D  v那你的代码要写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 则表达试就是我们要求的了。比如:7 B0 B1 n# s: h$ d* {0 A, I
    function GetMach(A,B,C,D) as String       '得到一个字符串组合如:(A+B*D)-C
    / X/ I2 x1 H& j$ S% t1 h$ m3 W0 Efunction GetValue(MachString) as Float    '得到字符串的计算值 ,可能是小数! g) g2 E6 a9 z' ~' N
    那么程序就好写了:
    # k3 k, _! L0 q( IGetNumber(&A,&B,&C,&D) ;    '得到ABCD则四个数字,赋给A,B,C,D四个变量
    ! Z8 z3 i* F- B* Vdo{& V5 ~/ k! O/ Y  \. ]
      MachString = GetMach(A,B,C,D); '得到一个表达试的字符传
    7 P/ @* {9 {8 Q$ e3 y) `0 M  if(GetValue(MachString)==24) break;
    & f/ a: d5 Q& G3 x1 f}
    8 t: o( Z: n7 [) u6 V3 Uprint XXXXXX;
    % C" ~- I% t% Z6 f0 \/ D

    该用户从未签到

    7
    发表于 2004-5-2 11:57:00 | 只看该作者
    我现在试着在写,就是不知道有什么好办法解决重复的算式问题,比如
    0 J% K- Q2 w7 [, _6 x3 Z(5-2)*8*1
    , J9 Y. S, d5 {4 `; M( s1 Z( C5 d
    (5-2)*1*8 6 z4 C' m8 H  z  d) w! |
    8*(5-2)*10 h+ f5 v3 M& o  v
    等等
  • TA的每日心情
    奋斗
    2015-9-17 00:58
  • 签到天数: 1 天

    [LV.1]初来乍到

    8
    发表于 2004-5-2 13:17:00 | 只看该作者
    9 A5 b* V. Y* z) H9 b6 }

    5 B, b" v  U. w9 o2 ^+ \花了一个上午,终于完成了0 `$ l5 O# d) j$ Y' `+ `% T
    你参考参考吧,哈哈3 A. t! p1 F! f8 `" b; H( j
    * Q1 Z+ u0 X( D- M: c* t) J) ^

    " Q( _: {8 P/ h9 B" {* G6 w' k
    [此贴子已经被作者于2004-5-2 13:43:13编辑过]
    $ `9 h6 n: d. P, ^
  • TA的每日心情
    奋斗
    2015-9-17 00:58
  • 签到天数: 1 天

    [LV.1]初来乍到

    9
    发表于 2004-5-2 13:42:00 | 只看该作者
    上面的发现有一点bug,) T6 v" K2 S2 L5 ]
    这个改过了
    % q) z0 q7 J7 H  f, Z一个计算 24 点的小游戏) j% {  c8 l2 C2 J! v
    VB 编写! `3 k: e- u) J7 V

    8 D6 \5 e% }& o: G$ b$ B0 u# E# g! I
    * s0 _, F) J1 p
    [此贴子已经被作者于2004-5-2 15:17:46编辑过]

    " q. J  ?9 c/ b( F& p

    该用户从未签到

    10
    发表于 2004-5-2 14:41:00 | 只看该作者
    #include * j% }( h9 h% x#include ( P( P% Z0 E+ u* K+ E 5 ?4 U3 `+ \6 E3 N# ~int EnumFormula(int min,int max,int num,int sum); ! N! r( V7 u+ C- s$ dvoid ShowFormula(int *Num,int *Sym,int count,int sum);3 Z; ]! |0 x! i/ u* t6 T8 a- i double GetFormulaVal(int *Num,int *Sym,int count);9 k7 b" Q a! O( k1 \9 C1 M3 z' \ int EnumArray(int *Num,int min,int max,int count); Y y7 Z6 ~8 x) Jvoid InitArray(int *Num,int min,int max,int count);. R* `& S5 ?7 b& {9 [$ E( w const char cSym[5] = {0,'+','-','*','/'}; 2 h) ~6 t/ X7 `6 A0 n, ]# h: J& R2 E& E; w2 V int main(int argc, char *argv[]) # Y8 i$ I* M5 Y2 |2 a# B5 V{9 ~/ U+ o! k# ?0 R( n printf("总计%d个式子\n",EnumFormula(1,10,4,24));3 g$ h+ `: `* i( \0 N: A( Z system("PAUSE"); . R% R- ^ |: d0 g7 g+ r return 0; 7 M/ c. E( Y' g) O8 ^} ; L, ^7 j8 _# J, ?) z, s5 U- J , W G) |* `. U1 K& Jint EnumFormula(int min,int max,int num,int sum)6 G- ~. Z y& L5 c4 I+ b {! n. h; R' K5 M int *FormulaNum = (int*)calloc(num,sizeof(int)); //储存操作数 - D: w" ]' R/ Q L; F" h //储存操作符号 c" B1 o2 [9 B+ Y. o //最后一位用于穷举结束标记: q: M2 } I) Q; e' G& b) P) _4 s // 1 - 4 代表 '+' '-' '*' '/' k) Y: Y$ @/ y2 Y! F# h! m% [ int *FormulaSym = (int*)calloc(num,sizeof(int));2 A4 G8 {( Q$ i$ S/ B# @$ t 0 _$ k3 r: i; B( v int result = 0; ' c' _! u0 C P9 x& H: Z+ G3 b // 初始化操作数和操作符号数组 % C. m; |0 I/ D . ]* i# I" y& e& c r int i; * j& |4 a0 `. N9 d - M1 |+ ?1 m, Y6 P for(i=0;i = min;4 `9 B) ^" P) n% V/ o for(i=0;i = 1; ' H7 t8 T) t! ^" r" Y9 g6 q( X FormulaNum[0]--;+ t" X/ x7 _$ r$ M& p2 o% Y% D. Q # _' `3 |. U/ e" i' |+ w InitArray(FormulaNum,min,max,num);5 v, B& x3 ` E5 [( y) K FormulaNum[num-1]++;6 p: T' |/ p9 V) t1 a. R0 s // 穷举操作数和操作符号组合 ! r% R; o0 \" `; i$ }% L' J, @ while(FormulaSym[num-1] == 1)) d% ^* ^$ l( K) Z- J% U: I { & T) N& K9 j8 N, n+ {3 l- q double t = GetFormulaVal(FormulaNum,FormulaSym,num) - sum; 3 j P! U( v6 s" T1 R$ |1 `- B if(t>-0.01 && t<0.01) - k5 m" i! k0 z' E6 q0 q3 [0 M! P5 f { 6 F3 b' K( N, x //printf("%d %d %d %d | %d %d %d ",FormulaNum[0],FormulaNum[1], 6 @6 p) A" m+ Q( j. x# h3 r* v //FormulaNum[2],FormulaNum[3],8 @0 h* g" K( @( ^0 K. L6 j5 u' B // FormulaSym[0],FormulaSym[1],% H3 y l* k5 V# O4 F // FormulaSym[2],FormulaSym[3]); ' i5 i+ \3 D" ` ShowFormula(FormulaNum,FormulaSym,num,sum); 5 u4 u. O9 y: o( g) L result++; : m7 y+ R" p+ a4 e- e; Y) I5 H }9 K7 P9 e: {# [- x% c% V: g' }. C0 L6 P8 n & c5 h4 m% d9 w // 依次穷举操作数 ; w, a* c2 ~2 _1 z$ }' g% j! K; A5 q& M * s0 T9 u" w* y; } //允许数字重复的穷举 2 y6 L7 s1 d( G //FormulaNum[0]++; b+ Z/ B. h H1 m) p9 ^0 S. d4 V8 o //for(i=0;FormulaNum > max && i ! W1 ]5 |1 H" x3 _6 n0 m- y //{* c+ M7 l% e) j$ F, v. e7 q7 ~ // FormulaNum = min;3 Y7 b# `4 S1 { // FormulaNum[i+1]++; ! r8 L6 ]- p) e) J1 _ //}& e( A# J4 j9 f7 S // 操作数穷举与操作符号穷举联接; u9 k9 E. l+ ? //if(FormulaNum[num-1] > max) % i' h! O7 @. n3 @" o: y //{ 4 w- ]. l0 W, [ // FormulaNum[num-1] = min; # C. i7 o1 A2 P9 ~. p/ O! ?, C // FormulaSym[0]++; 9 p6 x9 b- c3 C0 c, ?3 m& w9 } //}' ~, H, S ]8 [ - j) V6 Z2 w; U9 f // 不允许数字重复的穷举5 V2 [& \ j7 t- p8 w // 数字必须从小到大的排列,防止重复 % Q5 Q% \, ^$ {, I$ C& A- ` if((max - min)< num) exit(0); // 出错" O- K. k3 }, T) _ A + u8 S4 | M# [. g% C9 V5 V0 j if(EnumArray(FormulaNum,min,max,num)) $ G6 f9 I# [( g% k' _0 k" M, P { 2 z* g2 f3 U$ M5 ] FormulaSym[0]++; 5 F! m- ]- O a8 J; s4 d InitArray(FormulaNum,min,max,num); r( N( i2 ^% K FormulaNum[num-1]++; ; C% \5 V7 a+ |4 q2 Z: V( [ } / ]& d* T! E7 x% ~4 x7 ~9 }. a6 { ; q( c0 r$ a: U0 [' b7 T7 b // 操作符号穷举 , k' J9 c1 Q& y) J for(i=0;FormulaSym > 4 && i. l/ H; J- L6 t! R1 k3 h: b { 9 f M, c1 Y, z: u0 X) S/ ?2 \7 S FormulaSym = 1;9 @* g+ Q* H6 s- M& d FormulaSym[i+1]++; 3 k8 S2 V0 t4 f( P" d }$ {9 ~) ]9 G, S) b6 s 8 b2 u! G2 _* ]* R$ ~& g5 G } 4 W& P: h$ D) t2 i //释放空间; e* p3 l2 K" D) { j free(FormulaNum); 3 w! [# |1 ?; g( ? free(FormulaSym);- s1 _5 I# u# `+ u$ D. q5 w& _* n return result;# d' C, E8 a/ w5 S) n- }2 Z }) O. c/ I4 L1 d: }% f- ? // 计算算式结果 6 ~' M: s( u* G7 L1 ^double GetFormulaVal(int *Num,int *Sym,int count)# C% A F) d+ U# D4 R { . i1 e& T0 z: L" [* e$ B: v int i,j;+ }8 m- d, L: J( E' w% l6 K double preresult;. X/ _8 z$ Q) e6 E/ t preresult = Num[0];: |! Y6 p) i. I) ~' g5 S: a i=1;j=0;. K2 z7 N8 |: ]& \1 @4 A9 z& b while(i( K; i% \ g( T, w {) s8 P& x. ^4 J7 m' u switch(Sym[j])' `5 ~9 d7 b; B! K y {% l3 z9 B1 }# L case 1: V Y; Z9 G# g- ], e preresult += Num; 4 u# h) o6 h; w' S! {/ [: n: K+ P break; 0 ^5 s3 _5 s+ R5 e case 2:) O. O' l3 I" \4 W- E+ b, H" g preresult -= Num;% Z3 y0 n, j! ^! l U' J4 h break; $ a J6 v, k4 e* w; V case 3: : M! e. P! F: b3 \2 G preresult *= Num;% A# B: t0 {0 w: e break; U/ ]" t: X# ~7 Y; ]" t- M case 4: / n$ s: [ ~3 m5 t- M) [% y! k3 u if(Num == 0) return -1000; + z5 a8 m. J6 r9 k preresult /= Num;. ?- ?4 C8 {4 E( ? break; - v) _8 ] U$ m1 v) G; d) L }9 {/ Q% Z+ }4 C L- d8 j" e: h# `6 I i++;j++;2 A# l- i3 O' Q1 I } . V" e7 A/ Y- \! Q return preresult; //进行修正 : L# I: a \& ~" S+ ^2 U. N} 0 g9 [% a G8 F/ s7 Q8 N; c// 打印算式* H4 D* t0 \0 G: }% Z6 \; i! | void ShowFormula(int *Num,int *Sym,int count,int sum)3 S$ Y- Y& A/ K- q: R0 v5 Q! H {1 b' ?! `4 n& z" k2 n 3 Y6 P' M! ~: p. j/ L1 S. \ int i,j,len; $ n; o: U* Z" o- N char *Formula = (char*)calloc(count*4,sizeof(char)); 3 t; G$ }/ \' X3 P( O- p; M char temp[10]; . g* K( u/ C( @ itoa(Num[0],Formula,10);6 N! ]' g* ~( m, z) h i=1;j=0; 9 y/ M4 b; H/ ? while(i/ O4 p" ~# ?2 E {, y" l# H, o" _1 ?6 b" B itoa(Num,temp,10);4 K0 S: q, |( k, Q: o6 \ len = strlen(Formula); + f" z* s3 @9 @: a. [: ` switch(Sym[j]) ) M" c* C; \ e: Z' C! s! r {! i, W: E) \. K" \ case 1: - r/ T& @3 X- q% w3 R3 ^' Z case 2:# C& M4 U( B+ W1 V Formula[len] = cSym[Sym[j]]; & h- ] x8 L& J4 z) ] strcat(Formula,temp);$ w& _; d% n, o3 n* a2 y break;( V% Z4 i9 E) W) ^2 x# K case 3:; |- c- }# i: r( A E: M1 P case 4: ) y$ C$ Q5 j" ]0 V2 e) V ; R) r' g9 ~% B9 o2 F/ w // 如果上一个操作符号优先级低于当前的,应加上括号 " m2 X7 o8 o2 C( V3 ]6 O6 c, y if(j==0 || Sym[j-1] > 2); F( u. Y* g7 r6 e& k { 8 _+ R0 r- H# g+ p& c) Z Formula[len] = cSym[Sym[j]];( W2 j2 f+ P& C; v4 J3 F( J- [" f strcat(Formula,temp); 7 E* L- _* |" H. G) N$ S+ } }2 l5 j* G+ E9 B4 z' N else 5 M, R0 N5 b4 G7 c0 V! k { : t: I* `; L( S/ p+ Q& }; n( r int n;! w( V5 w/ C" {7 p2 u# i char *FormulaTemp = (char*)calloc(len+1,sizeof(char)); # D; E8 E& A, g* m! o" r for(n=0;n) A0 y. j* j2 h$ t { 4 e& y a( _' _; \# |0 k' i1 q FormulaTemp[n] = Formula[n];* L; n) U5 e4 ~ Formula[n] = 0; 9 R8 ^" b% Z0 R- q+ F1 p$ N4 ` }3 {7 s& Y8 X. r2 q- x" | Formula[0] = '('; 6 B5 z) n1 S# C strcat(Formula,FormulaTemp); 3 p- T7 i7 \0 V. n$ {0 o free(FormulaTemp);3 X7 k) s( ]( y6 D, ?5 r& \ Formula[len+1] =')'; . ^! o+ D/ u' j7 ? Formula[len+2] = cSym[Sym[j]]; 1 B' H: E& ]& r6 l4 Z strcat(Formula,temp); h Y# z9 X# T& |5 _# Z$ y }7 h- e! U/ k( u! L. u break; 8 j- l& Y, a7 S6 w+ M' J# Y } ) E* Y' J# v* b& y/ c i++;j++;+ ]8 L7 ?( X7 j }3 h2 K0 ?, S9 w% G2 h printf("%s",Formula); 9 E* M. ^# ~$ T9 Y8 v0 H printf("=%d\n",sum);( J( y: |1 D) b) K( c free(Formula);4 G. Q! [! |4 ?% K, c; T2 J; T4 G }1 N+ q- C, d" @& K& w, @# V " A/ d" v5 Q2 w6 u! V- `9 C // 以当前数组为基础得到一个从小到大排列的数组1 _- B0 x6 q0 o4 e4 M- l; ^ // 返回非0表示穷举结束 + n3 H/ a- ^) I5 ~, }1 `int EnumArray(int *Num,int min,int max,int count) & ?! X# c' p& `; o3 |{ + Z3 V7 N- x* m$ i, G0 i0 ^; K4 F int i,top;; u; N/ {7 T* d$ B r( g2 { top = count-1; % |7 D! h& A& ~$ |3 c Num[top]++;' p) D, k8 L/ e) t0 E8 Q5 L while(Num[top]>max-count+top+1 && top>=0)" x; Q" Z. V1 ^ {$ v R2 r0 z1 c% x top--;: ?4 L7 D8 b7 Z+ n6 P Num[top]++;# [8 O" u) C! l- ~ }+ e k1 f0 m0 y6 \ for(i=top+1;i8 _$ Q) U5 y* F M { + O2 h/ K! c* F |6 }, g0 g Num = Num[i-1]+1;1 n% }: n3 t) Q5 y1 \0 p0 ^: o" @ } ' x2 G o5 Y$ h/ v8 ?( w7 e) E if(Num[count-1] > max) return 1; ; F: Z- d3 ?- j2 t9 a5 ]4 @ else return 0; / T k: a, r# q2 A} 3 w: i+ M) N4 }8 a% W, }3 r% N5 |2 b // 不允许重复的初始化数组 , B; H: h/ `: Avoid InitArray(int *Num,int min,int max,int count)$ p- @( B6 g; y! r g" X { 7 }7 `# A2 b0 C; |& H5 Z, K int i; * Y4 Q0 G5 o- |% I) b o for(i=0;i=min+i;) _; I8 T$ i! g' {# r: ?2 _ Num[count-1]--;+ \5 l" \) k7 e! K# z }, U" [& ?+ c# b) u6 Y0 L( Y 9 A9 @- @# u# v- d- H5 y, L3 | ! C( J0 K2 d* j" S * P# q2 Y# w U: T( j8 W ! h- x( ]$ @: v0 w: x5 L( @
    [此贴子已经被作者于2004-5-2 14:50:47编辑过]
    5 ?. q+ y3 O. T @

    该用户从未签到

    11
    发表于 2004-5-2 14:54:00 | 只看该作者
    本法穷举出所有用min - max之间的num个数组成算式,结果为sum的情况, ^6 a, l, X& O& Q8 a$ n  P
    ; F3 z1 E! @, f: D( @
    如要具体的话,可以不穷举操作数,直接输入操作数,进行操作符号穷举
  • TA的每日心情
    奋斗
    2015-9-17 00:58
  • 签到天数: 1 天

    [LV.1]初来乍到

    12
    发表于 2004-5-2 15:17:00 | 只看该作者
    以下是引用游侠无极限在2004-5-2 14:41:26的发言: ' s3 A9 ?+ l6 \$ C" ~5 P# {2 H#include 8 k( A9 V, d5 X# [; b9 S #include : B& Q1 r! ^( H6 S. b% T* K 7 k C* Z i0 C/ M* W, t int EnumFormula(int min,int max,int num,int sum);! ?. t4 j1 x, }* V! n/ X/ o void ShowFormula(int *Num,int *Sym,int count,int sum);+ M& d2 e+ W) p' P7 k double GetFormulaVal(int *Num,int *Sym,int count);) a1 Z4 h3 Y3 o6 N int EnumArray(int *Num,int min,int max,int count); U+ y+ n' m5 _ void InitArray(int *Num,int min,int max,int count);4 P, p! c) S! X @+ A/ J! N+ B+ I; [ const char cSym[5] = {0,'+','-','*','/'};1 _+ ~( i2 v& A' R5 f" u * n; @% C$ u) o2 t/ `! B0 \3 V int main(int argc, char *argv[]) ' Z# f O ^8 n. C9 S6 G; i {" f/ k5 L* ^' w8 S$ o8 t q( O7 O' f printf("总计%d个式子\n",EnumFormula(1,10,4,24));! I) E( K8 ^; I, x s% g$ ~ system("AUSE"); # n2 k! k# n" e% R+ |/ m return 0; " \8 m& ?3 C0 ^( ~( I }7 m1 D) e* F& i/ J% w 8 u" `# ?( r* v0 W+ v) S int EnumFormula(int min,int max,int num,int sum) ) J+ M0 q& g( Z( x( N2 x { 5 o$ @3 D0 t, X6 x- ~% A6 w4 v int *FormulaNum = (int*)calloc(num,sizeof(int)); //储存操作数 * b1 X+ U O) I //储存操作符号3 ~2 r3 D+ d7 C, Y //最后一位用于穷举结束标记9 X0 W9 u _5 p8 [8 Y; q# o // 1 - 4 代表 '+' '-' '*' '/' . Q: u0 i! i5 @( R! x7 a int *FormulaSym = (int*)calloc(num,sizeof(int));( e' M8 z2 O! N+ N 9 R; A9 g/ w, |( I3 U, C1 L int result = 0; 8 r: h, F# ]3 `- Z% M" O/ P // 初始化操作数和操作符号数组! M5 I* b( W) B9 U# ^6 J + ~' Y" B- _$ g- _ int i; ' e+ c3 ~) ?! F: M$ z4 K( n/ p9 m8 \9 z for(i=0;i = min;# M, e$ N/ _( q9 s for(i=0;i = 1; 5 T0 d5 s. d; Z9 i" \. x' k" D FormulaNum[0]--;5 |, b' I3 q+ ]0 Z+ |6 V8 c ( C* `, u' j' K6 z InitArray(FormulaNum,min,max,num); 4 J5 @/ k$ I+ x' [6 s) r FormulaNum[num-1]++; - R: G+ B; \* a5 d // 穷举操作数和操作符号组合: X. S" a$ H, x0 w! J# F while(FormulaSym[num-1] == 1) 9 O- \) _5 E/ s8 z {$ W2 O+ v* _8 P3 W double t = GetFormulaVal(FormulaNum,FormulaSym,num) - sum; 7 V$ @2 \- L9 x. x4 s4 ?0 J if(t>-0.01 && t<0.01) " d+ G4 A9 O: x+ V { . u8 o: H; e* z1 t( g9 | //printf("%d %d %d %d | %d %d %d ",FormulaNum[0],FormulaNum[1], 6 t; L7 W! |$ }3 N2 l. K //FormulaNum[2],FormulaNum[3], + l% L# B6 Y( K8 t; E7 W // FormulaSym[0],FormulaSym[1], # l7 b4 k L7 [& X' ?1 C4 H1 D0 w // FormulaSym[2],FormulaSym[3]); # B( `. D. H" w' W ShowFormula(FormulaNum,FormulaSym,num,sum);% z! \7 ~1 z4 Z8 N result++; $ M0 h9 |' _2 h) W } 3 c7 ]) I1 u5 p8 A9 T! ] 2 F$ F1 t# w. h. M* e a // 依次穷举操作数 % Q j4 J, b' R1 W , @; i$ B+ v1 z //允许数字重复的穷举; q F6 }, X2 @ r- w //FormulaNum[0]++; 9 q4 W. j4 G5 X/ S+ H" @# ` //for(i=0;FormulaNum > max && i; }. l0 D- R" s4 b. e& d7 X. G //{" i( W8 u/ H* B* e7 W5 V: [ // FormulaNum = min; ) G5 p: ?7 m* i0 j l9 }/ x2 Z+ n- b // FormulaNum[i+1]++;* n4 o* A0 y. h- v/ x //} % J4 U( l. h/ m3 w$ X @ // 操作数穷举与操作符号穷举联接 ( g/ ?, @( J1 P7 r //if(FormulaNum[num-1] > max) 7 n" S8 @/ L! N5 N- T% d# r5 s //{9 o6 e+ U0 E" Y' E+ U ^3 [2 J( o // FormulaNum[num-1] = min;# _4 u) e- j7 Y# n* E7 A // FormulaSym[0]++; / h f/ [1 ]* S //}* q, ]% V9 d, _( _% o# ]) f( s% ~ A; x, r- s+ a6 z* u2 `) [ // 不允许数字重复的穷举0 v7 @- A. m J% A& t& p // 数字必须从小到大的排列,防止重复6 [7 X( h: n" Q q" G* I0 I7 k if((max - min)< num) exit(0); // 出错2 m& T9 U! F) } 2 E- e# W) m9 F! h6 g. o4 R3 R) c if(EnumArray(FormulaNum,min,max,num)) ! M5 C+ {- H+ n0 g: t) K/ s { 4 A% D. H, E3 o# | FormulaSym[0]++;+ e7 j4 |$ P3 y' D! ] InitArray(FormulaNum,min,max,num); |6 b' w& m/ y) g2 O FormulaNum[num-1]++; . q/ E4 O, g# _" c$ L1 ^ z4 n }' |6 N* O3 d+ ? ) m$ t$ N) _ `" H- f // 操作符号穷举 3 N U& q e) r% z) j for(i=0;FormulaSym > 4 && i- ~! ~* T/ L$ ?! J8 C+ } { 4 ^8 R, p0 u, v+ t FormulaSym = 1;6 C4 y" O; o1 D/ f' I) }) g+ q( ` FormulaSym[i+1]++;1 @5 h! W1 I N1 g; a }0 n; o! f6 k2 f( x D8 t, V7 A2 g6 P3 {! F }; i6 V! ]" _5 o2 s //释放空间: {' z3 v& s2 n' q) `- B free(FormulaNum); ! E' @! R9 S L free(FormulaSym); # {% b; e" t1 f. r return result; ; u7 `; R* B" C' t- {- T }$ S" G, h4 V- G$ \3 g9 ^ // 计算算式结果1 l; q9 J+ _! z6 L4 c0 @# U- Z. z double GetFormulaVal(int *Num,int *Sym,int count)% @' K9 H) T' p Z {- `/ C5 X. {+ ~: F4 [ int i,j;( x% J$ j7 M4 L$ M' x) G double preresult; 5 P( E* e$ f3 ]* p' Q x preresult = Num[0]; : p8 Z7 q% M' v1 q! _: } i=1;j=0; * r% r1 e0 |0 R) L% @" Q# O while(i8 T( u( n) c* g% ~ {8 P% k, A4 P7 G1 [ switch(Sym[j])5 F1 D/ w' `* c) ~/ N1 C" Y { 5 G3 t7 w k% q( S3 i6 o2 q/ v1 k case 1: 4 B2 ~, Q) G' o4 z8 M preresult += Num;& ]8 x1 Y! f6 Y) u- L0 S break;7 L& o$ {$ k: W case 2:# [& H- D3 W' x% O) `/ w preresult -= Num; X1 t- Z. V! N B, K% ?7 e3 p8 a break;* P; M# y( O$ N; m# E V1 u. l case 3: 6 L6 c. G" w' N* l preresult *= Num;; B( _2 k+ z4 W9 b8 ~ break;- G( P/ |" r5 {) T. H7 `* I6 T* d case 4:, l0 Z! W2 h: s if(Num == 0) return -1000;- u1 @4 V7 F5 t preresult /= Num; 9 j& o/ G7 _" w" |) T break; % E' }8 u# r% W+ G7 e2 r } 7 Z6 |1 p2 K" b i++;j++;0 ?: y; o: M4 t0 Y* _2 D r V8 f }7 l) F# Q( W' r( J6 t4 ]9 a return preresult; //进行修正4 R$ ]' @3 s7 X! `! O } # K, q! y: y. [ Y! w* U // 打印算式 $ h* Q& \: t U: Q( H5 A8 t+ ? void ShowFormula(int *Num,int *Sym,int count,int sum): F: ?0 O0 M0 p u8 B {7 @' O: W% l2 h' i 9 A! g% x% U1 U* F* c int i,j,len;' }' F9 U7 n: l1 d: ?7 t& J5 _ char *Formula = (char*)calloc(count*4,sizeof(char));4 z" T: {& [9 P5 t U char temp[10]; ; y# Q4 b. G9 G2 ~) @0 {+ d; r0 @ itoa(Num[0],Formula,10);: F1 Q5 g+ S- ? `: q i=1;j=0; ) ~# Y' t4 @7 Y0 H% i8 h* n while(i: Q7 |$ j+ S0 \2 B" e { # ]7 C9 F# i9 G, w, L9 I itoa(Num,temp,10);- z6 m1 U! z. W' _3 P len = strlen(Formula); . ~$ t$ m# R F2 |, C ~ switch(Sym[j]) 4 r* @: b) m- c, j! u& Y7 c4 I { , ?# h* `' Z& @6 U9 ` case 1: - v8 x. T0 v7 |0 r case 2: 0 o K& |" W0 W Formula[len] = cSym[Sym[j]];. \. e" _6 s% x3 M strcat(Formula,temp);* L: q0 C' n m- y5 x break; 9 D4 ~% o! P0 _ case 3:" C% |" x' o E3 c% {* j l! } case 4:( A# C$ p- X9 ?7 m" c' [ % Z/ C3 V1 b8 V% }/ y // 如果上一个操作符号优先级低于当前的,应加上括号 + b$ B2 T( G, ]# k if(j==0 || Sym[j-1] > 2)! q/ k5 | F- Z' n) Q c: \& M$ ~ { + a f& N% D9 j7 r7 F Formula[len] = cSym[Sym[j]];% Q0 z2 T; ^. o4 K strcat(Formula,temp); 6 a( B; P5 }" g5 R8 Y3 i" K }: t! t$ V2 @3 b4 D/ Y+ ]/ E8 Q else, a- C+ m$ y0 [9 G {2 L3 G: M3 S! M: t int n; : f& J% W' M$ a6 v3 |- B" T, j' ]4 G char *FormulaTemp = (char*)calloc(len+1,sizeof(char));7 S2 w- \0 v/ k1 ~* Y5 { for(n=0;n- B, t: Y) ~( O& d {1 p" M" C' D1 ^( O* y2 `' m8 n FormulaTemp[n] = Formula[n]; % D- q3 |- x% ~6 \( u. g Formula[n] = 0;! F l7 V; ~) D# p' c }( B* j, ]- D [2 N2 M! M Formula[0] = '('; 7 G* K( O# L* `$ i' U strcat(Formula,FormulaTemp);7 g6 s9 K) L2 m0 |- r) J free(FormulaTemp);, Q0 u) p8 i" o% N Formula[len+1] =')';5 H$ ?4 G( x% n; P& h7 e$ Y3 c Formula[len+2] = cSym[Sym[j]]; `# J, ~/ n5 D' ~3 } strcat(Formula,temp);, |# W$ S: Q; A5 R. J# D } ; u2 @$ d% R4 x* l1 r, Q7 v+ U break; O2 a! ]! l2 z1 X% E5 i8 f! z+ Z } 4 P: r: ^2 c2 _$ k' s i++;j++;4 D" g/ R! J0 g0 z } 9 q* q! \# \: \( r) @5 W0 W" g printf("%s",Formula);# D, v4 P8 P3 G* C printf("=%d\n",sum);& @6 E2 C* x+ _" ]# S p free(Formula);) A( E* h5 ^( t | } : A: ?! q: }2 f) ~; u0 f+ d2 U1 T4 e+ O3 q# f4 z // 以当前数组为基础得到一个从小到大排列的数组 * g- G8 n; y1 `! q+ k2 x // 返回非0表示穷举结束 $ {. W5 A3 c7 H* {9 ? int EnumArray(int *Num,int min,int max,int count) , x! B; v. ~1 W) N5 p& D. N, N { + i: L; ^, e3 y* W# D& N: ~ int i,top;3 }# O. [; `) q6 y& s top = count-1; 4 E% V% e0 o3 n: V Num[top]++;* A7 g% [; t7 K- N( J while(Num[top]>max-count+top+1 && top>=0), P; {4 K$ }. {/ b7 u \ { 0 W; k& N' f/ o, `& g( \: E top--;1 \# y; r) v* \6 z0 v4 @ Num[top]++;( E2 r+ o- G5 M7 k7 E4 U* o; {: j8 n }* a: k% O, S7 t8 q for(i=top+1;i) p0 F) ]) x: m8 o, H. _ {& x5 W& h, q& }0 f7 M0 i5 G! k Num = Num[i-1]+1; ( v: u4 x; v3 Z6 C }+ @0 N+ ^" s2 d" B: C6 o% v if(Num[count-1] > max) return 1;6 F! `% C/ O$ _/ `1 f else return 0;' t1 [6 j' T3 ` } $ t8 n2 P& w& F; @" f% R3 F& ~7 {8 f. `# n2 g // 不允许重复的初始化数组 3 p9 o$ S8 w- y$ q1 I+ T8 a void InitArray(int *Num,int min,int max,int count): r: W* {" T P1 g( s2 L { 9 [& S2 h! s( T9 k+ N4 C int i;8 k4 L: S1 J4 K( ~ for(i=0;i=min+i; # e0 d0 }# z% [2 V) A Num[count-1]--;* O2 b& {. [" F9 A, R }' m! t8 o3 b( i- ~ ( ^/ q4 D( |- _+ o% H5 x ( W9 k( ^ n4 Z4 |0 l; M6 N) N$ F* B7 d& \6 P: r9 B! ~ & t) ^5 p& R9 l; i. I+ {3 w; L5 u% o
    [此贴子已经被作者于2004-5-2 14:50:47编辑过]
    , p7 g1 j% O+ A. m& P4 N; P % Q4 w7 H9 N! q/ c) a6 `printf("总计%d个式子\n",EnumFormula(1,10,4,24)); 的运行结果是: - Y& J# }+ e2 n- b% i% W1+4+9+10=24 6 P9 N- }) e: X1+5+8+10=24/ p2 Q/ g+ ?4 t# S 1+6+7+10=249 u# ~8 E9 D5 A" D' f g5 h6 h 1+6+8+9=241 U6 w& k/ s/ F, ~( A* c 2+3+9+10=24 w+ \3 i- F5 n! O) N9 B; Z w2+4+8+10=24% @8 s8 U F% j a$ o 2+5+7+10=24" K* J. d& y; `/ X" k 2+5+8+9=24 : m0 h+ e5 N* ~2+6+7+9=24 1 a! t& D! n% X1 K% x6 K1 A3+4+7+10=24 3 `/ n' O& w8 ?3+4+8+9=24 6 `- M E; Q' X$ s8 M3+5+6+10=24: R5 J2 q$ h2 v5 } 3+5+7+9=24 1 D+ j* [ i+ _) r5 }3+6+7+8=24 / g4 e6 G$ w( ?2 G4 G' g2 A9 b4+5+6+9=24& g. T k8 V( ?. j# S/ V: Y 4+5+7+8=24 ^" ?/ Q6 l- T/ A/ E9 B, s 这是什么意思?似乎是找出了 1 至 10 之间的和是24 的数据,这和完成计算24点,差很多吧?/ F9 j. ?8 V% X! S2 e' W 比如用户输入 2 ,5,7,8 程序应该能得到计算这四个数据得到24的表达式才行啊,这样就可以写一个游戏了。8 m" z+ H; j% k; B1 B0 ~; b7 ~9 o 如: 1,5,7,8 有如下方法可以算出 24& b: \$ o/ U( o# n3 d ((1+7)-5)*8 = 24 `/ i( T* J0 [9 I ((7+1)-5)*8 = 24 ; m$ Y; Q. o# Y" v(1+7)*(8-5) = 24 ( x! D. l5 W% `- u3 ](7+1)*(8-5) = 245 j7 C5 j" d3 |+ z: Y+ O: r1 M ((1-5)+7)*8 = 24 5 Y' M1 n) q4 ]3 ?* E6 i$ a$ A6 i7 D((7-5)+1)*8 = 24 & |1 m4 g5 Y6 }( i$ U(8-5)*(1+7) = 24 4 K( R) e; _, V3 g7 N6 A& \(8-5)*(7+1) = 24- Y0 u, Z; K7 n, z$ h; K3 K& S 8*(1+7-5) = 24 / W4 k( T% ?. e5 k% O7 g- \( Q8*((1+7)-5) = 24# Q) u! M* @! x d% a- b 8*(1+(7-5)) = 24 & p* c9 v* H+ ^+ y8*(7+1-5) = 24 1 c. w' k' g" E4 k8 o; G, C% ~8*((7+1)-5) = 24 ! o' i D7 k" @ A8*(7+(1-5)) = 24+ N4 w( N) n% `; ^# N: m+ P0 I3 i# j 8*(1-5+7) = 246 ^1 e; [' K5 L j z6 l! N( w* @ 8*((1-5)+7) = 24; Y, }9 ^ p7 n& v 8*(7-5+1) = 244 \6 k2 h5 t; p2 o& u 8*((7-5)+1) = 24 * O$ o" j! E) F6 @1 r% }

    该用户从未签到

    13
    发表于 2004-5-2 15:21:00 | 只看该作者
    结果是这样的:
    ' u" G! C7 F+ \  l1+4+9+10=24% L7 E- `# q) f
    1+5+8+10=24
    ( k7 r9 A2 R2 c( D; W2 o6 a1+6+7+10=24
    - }$ e. y  L# q" d% i! v2 {1+6+8+9=24* N. }; y' o0 o# p
    2+3+9+10=24
    & l; h; x! O* s" L. h, r2+4+8+10=24
    2 [' E% M9 D2 {; S/ ~2+5+7+10=24
    7 u2 x  Y' |) Q' w2+5+8+9=24! j1 P# ]1 D3 l9 f9 B7 L
    2+6+7+9=249 T  v* {+ \; h1 O0 ^% F0 u/ S* N
    3+4+7+10=24
    9 Z" o, s5 t9 I: v) ~) R8 [* A3+4+8+9=24
      z0 x) M$ x- y/ {: y: I3+5+6+10=241 `) q+ C5 c. V+ H( t
    3+5+7+9=24
    % z" K! K$ B+ k2 h: \1 N3+6+7+8=24
    3 m3 h: ?) Z8 l' h7 m0 D4+5+6+9=24
    2 m, ^3 F& S# d- C4+5+7+8=24
    % Y3 |7 o9 h# C/ B* v  S. v; j1*5+9+10=24  W9 v( p, o* N, [5 a' Q
    1*6+8+10=24$ q! v  R7 m# J
    1*7+8+9=24. M! J( _- O* d* e
    2*3+8+10=24
    ' `# D5 C0 V/ Q, [9 l& x2*4+6+10=249 H& {) [, M- U6 p8 l
    2*4+7+9=24
    * Y! w' G  U% g$ t+ l  ~, E% E8 i2*5+6+8=244 D- }$ N, s& V5 f* M9 R3 f+ c5 [
    3*4+5+7=24
    * B, y7 a8 ]2 I' B5 t4*5-6+10=246 _- V2 l+ \; h) n6 ]. c
    (1+2)*5+9=24
    $ B8 q4 J. \" |/ g1 S, x( ~(1+3)*4+8=24
    0 A* L2 p" N2 E1*2*7+10=24
    3 k) `: ]- |$ D% s( \1*3*5+9=24
    " K! m6 C/ b( d: _9 K6*7-8-10=24
    9 ]3 v) l( h3 e9 E7 K8 A(2+4)*5-6=24
    ( d; u" `( f( I' A1 C! w2*3*5-6=240 D- Q( x. A5 g# \; B
    (1+2+3)*4=24
    6 X* L$ t2 a6 l) P. ](1-2+4)*8=24+ ]) }' n& Z3 Q0 r) B7 M! i
    (1-2+5)*6=24
      ?& \0 \, {/ d2 h: g: q(1-3+5)*8=24
    & |+ n/ q  i+ }' g/ }( E9 K0 U6 G6 ^(1-4+6)*8=24" w) [7 h, c  M" c9 l* v
    (1-5+7)*8=24
    1 P9 r" ]' {( _8 p(2-3+4)*8=240 C6 r9 t2 f% V' B2 W- |' U% x
    (2-3+5)*6=243 E1 P. C! `; \
    (2-4+5)*8=24
    ! y& P( S, |6 `1 `6 H4 o& w(2-5+6)*8=24
    ' Z, ?- H! I4 x  A; g' q/ n(2-6+7)*8=245 U& c7 V: y: E! y+ |
    (3-4+5)*6=24
    1 T6 }' h; v# K) ~5 b(4+5-6)*8=24- v- q3 ?6 R/ e! ]
    (4+6-7)*8=24, J7 P$ r4 V2 y
    (2*4-5)*8=24  @# |( {4 y9 I
    (2*5-7)*8=24
    , [9 C  d2 t$ L+ z8 e5 q1*2*3*4=244 }4 R* j; D, S; d! W
    1/2*6*8=243 c; J2 E( B0 P( J' s& z
    1/3*8*9=24
    ; K- a; v1 u0 Z; D# Q% E2/3*4*9=24  V# W9 V5 B& D- L: Y
    2/4*6*8=24/ j% W2 _0 ?( J4 c' |
    2/5*6*10=24
    4 X) X' T( G# B0 Q% ?2/6*8*9=24
    7 W; D  s5 |5 f, @0 D$ Q3*4/5*10=24  j0 |+ T- i0 p" |, v
    5*6*8/10=24* r" U7 w4 ]0 \2 l
    总计57个式子

    该用户从未签到

    14
    发表于 2004-5-2 15:22:00 | 只看该作者
    当然不会只考虑加法的情况,大概你复制的时候出现问题了,你可以下载这页最上面的那个程序+ a0 {/ y( d( r0 S2 y5 E, }
  • TA的每日心情
    奋斗
    2015-9-17 00:58
  • 签到天数: 1 天

    [LV.1]初来乍到

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

    [LV.1]初来乍到

    16
    发表于 2004-5-2 15:28:00 | 只看该作者
    (2-1)*3*8 这个算式你就没有啊,这4个数字的组合都没有出现9 t8 h; Y! r3 V$ r( }$ B

    # q, d. v6 E% G
    ' p5 X% e) R4 w* o4 }, c+ b5 {) |6 H

    4 C5 l" W& A, g# _+ k$ ^' j5 W8 @$ W9 P2 s: ]; S
    : M* |% k% I# d4 q* l/ e' P
    [此贴子已经被作者于2004-5-2 15:32:12编辑过]
    7 W# P( s7 x8 b- v% m* M+ F: Z2 \
  • 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 | 只看该作者
    5 R0 G; j- y1 H3 g3 |

    . M( G' c9 I5 a7 Q6 j# \4 h用这个好了,只不过输入的时候要按从小到大
    ( K" H8 R. N+ I% S& @" ~# \2 }# e% |; g: ?3 F' J4 E; m0 v* |) T
    好象有BUG,我暂时不太清楚

    该用户从未签到

    20
    发表于 2004-5-2 15:38:00 | 只看该作者
    以下是引用yzhlinux在2004-5-2 15:28:15的发言:
    / |5 a: X! J' R0 k(2-1)*3*8 这个算式你就没有啊,这4个数字的组合都没有出现

    " F3 C& w4 U+ g6 B) m. a) S+ q% U& y+ ?% |6 F  E0 N
    本来为了防止诸如2 ]. e  _' F6 j0 t) s4 J
    1*2*3*4
      w" w& V1 O, H% ?8 a! \$ \1*3*4*21 |/ Z9 {0 ]7 f) u7 \& m1 n
    2*3*4*1
    ) n! j+ K3 p1 Y  Y$ w2 a等的重复,只使用了从小到大的数组,不过这样好象也丢了不少可行的式子0 P" Z# S: V- h9 u; C

    : r5 L  y* U4 e3 G, X0 E1 ?另外你的程序就是有这些重复的
    * p" d  s6 S3 k; `) S, ]" K3 N+ x% }+ Y
    8 q7 c0 x6 H- f- ePS:VB的程序感觉就是慢好多啊
    ! t: T3 p5 x4 d0 M& B! _  l
    [此贴子已经被作者于2004-5-2 15:42:01编辑过]

    # w; b4 a/ s. q: @2 g0 E0 o' y

    本版积分规则

    关闭

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

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