下沙论坛

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

用新浪微博连接

一步搞定

QQ登录

QQ登录

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

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

[复制链接]

该用户从未签到

跳转到指定楼层
1
发表于 2004-4-27 17:53:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
就是扑克里的24点游戏,4个数,+-*/得24……
3 w$ G) w8 r6 c) w/ L" S/ P
3 O1 W/ S* j" f9 L偶还在想……
分享到:  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的发言:
    ; N7 V# Q" ~- i- V* Z" d' J, y穷举法吧

    4 k4 w- V# B$ S5 E* M3 G1 F# f, k那你的代码要写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 则表达试就是我们要求的了。比如:
    : H; ]( m; Q: e% R  A8 a2 ufunction GetMach(A,B,C,D) as String       '得到一个字符串组合如:(A+B*D)-C
    1 [2 I6 B. |  e$ N0 Jfunction GetValue(MachString) as Float    '得到字符串的计算值 ,可能是小数6 ~# H; l( X" w+ Q- l
    那么程序就好写了:' E1 ]; ~* `. G; w7 z8 Y
    GetNumber(&A,&B,&C,&D) ;    '得到ABCD则四个数字,赋给A,B,C,D四个变量3 Z9 R9 F1 @  e, C3 J
    do{
    , t, }5 c# J# ^/ k0 M  MachString = GetMach(A,B,C,D); '得到一个表达试的字符传. t* s4 T' g4 H# ?- M
      if(GetValue(MachString)==24) break;: v$ I+ O8 {+ c' U8 L- p
    }/ Y6 ^. u# F3 U4 U2 ^
    print XXXXXX;
    . i4 D5 c# }% e3 u& t/ R+ g* M4 Y" ?

    该用户从未签到

    7
    发表于 2004-5-2 11:57:00 | 只看该作者
    我现在试着在写,就是不知道有什么好办法解决重复的算式问题,比如4 H8 `' v! A) ^' q1 m4 V
    (5-2)*8*1
    1 K5 _$ m$ n, K6 @  R7 V8 M7 D: d# ?, n. q# Z
    (5-2)*1*8 / b! U+ }, n/ n# W* u% b. S- A
    8*(5-2)*1: ], _4 \0 ~# i( }
    等等
  • TA的每日心情
    奋斗
    2015-9-17 00:58
  • 签到天数: 1 天

    [LV.1]初来乍到

    8
    发表于 2004-5-2 13:17:00 | 只看该作者
    2 x4 [$ u. w5 n' J/ h. N$ X

    9 I! p* S* A3 K5 z2 s! R花了一个上午,终于完成了( {4 b: R1 v* S% h
    你参考参考吧,哈哈4 ^+ A! c8 H3 u6 C1 Q. P

    ! C9 z+ [  m! J. Q% G& W4 b1 p, |9 @5 H1 Z* K( z4 N
    [此贴子已经被作者于2004-5-2 13:43:13编辑过]
    " x! V  p: t' F3 n: ?" l$ P* O
  • TA的每日心情
    奋斗
    2015-9-17 00:58
  • 签到天数: 1 天

    [LV.1]初来乍到

    9
    发表于 2004-5-2 13:42:00 | 只看该作者
    上面的发现有一点bug,
    4 b* A0 P  P* f6 e+ d3 L这个改过了
    , d9 f7 u) z; |% o% F$ p; N一个计算 24 点的小游戏
    7 n# ]6 e& o+ BVB 编写' ^* S5 p" ~! Y$ ]3 W

    + O! y% k5 j+ c* y! o" z0 y+ n
    6 w, @4 z; c+ b2 L) S. T! l
    [此贴子已经被作者于2004-5-2 15:17:46编辑过]

    $ u- _! M2 E7 O+ B9 ^

    该用户从未签到

    10
    发表于 2004-5-2 14:41:00 | 只看该作者
    #include ; U2 m, P8 {1 r! ]8 G$ e3 S #include 1 j8 x9 [4 J+ `" M" d) [) @/ N - B3 X) B, |* H6 Y& h) cint EnumFormula(int min,int max,int num,int sum);" q, K0 r& h' P2 v V" z void ShowFormula(int *Num,int *Sym,int count,int sum); , S: ~! c6 ~" ?6 y- Zdouble GetFormulaVal(int *Num,int *Sym,int count); ; ?% Z# b; p& gint EnumArray(int *Num,int min,int max,int count); 2 P3 @; z, x! B- S& Lvoid InitArray(int *Num,int min,int max,int count); : L3 L0 N1 W$ r& K$ Wconst char cSym[5] = {0,'+','-','*','/'}; , L8 B; ?( [5 U, H* k 1 h# i! T; i3 V% @ V8 U( Vint main(int argc, char *argv[]) ' D( E# S! s! |+ w! F1 w( Z{' C& @7 J: g( `5 ~* U; q printf("总计%d个式子\n",EnumFormula(1,10,4,24));2 Q3 q6 F4 _ o- ?8 o system("PAUSE"); ! i- d% P# }, A% P/ \3 f: N5 a1 b# I return 0; 7 r) p6 E+ w) `. Y1 a! m}9 t3 S) |8 q" G7 R+ v. z! j7 H ( O/ i; T" H* ^1 G f& I& A( Mint EnumFormula(int min,int max,int num,int sum) ( v* z+ L. x, H* ?8 e{ % m* Y I- @0 ?0 y. C1 N int *FormulaNum = (int*)calloc(num,sizeof(int)); //储存操作数+ N5 n5 B/ B4 ^9 _5 _! e: H //储存操作符号8 j* I3 P5 U. B6 y j2 R, M! T //最后一位用于穷举结束标记 ! a6 o3 i( x9 n9 t& W // 1 - 4 代表 '+' '-' '*' '/' : Q2 V) e- W }% u5 A int *FormulaSym = (int*)calloc(num,sizeof(int)); ( N$ }5 [2 {1 ]2 n5 x2 [0 B 7 n9 H7 o$ F, y2 y7 L; h9 A f int result = 0;; k. c z) V- ]. ~) c- t // 初始化操作数和操作符号数组 2 j; B; c" c8 G# m7 |' P ( \ ?$ s5 t. ]6 ~ int i; & b7 B+ g* B& w7 d* V. M 8 n1 ]9 o6 @5 t: a0 q' F for(i=0;i = min; i0 g5 |3 j3 A! }2 ~ for(i=0;i = 1;" `( Y4 @- l2 `- a FormulaNum[0]--;: o* s: _) l& h1 b" i- D1 `+ }0 Y ) B6 i* s& i' f' l* ~( ` InitArray(FormulaNum,min,max,num); / `( b# N( l& ~7 f" Z6 P FormulaNum[num-1]++; 2 V! _# v; e- }2 Y2 p' P3 C, |) P: M // 穷举操作数和操作符号组合! @% t9 m0 |' v5 M0 ~ while(FormulaSym[num-1] == 1) 9 ?, j) y% j- J+ p' ?* \& s! w+ W { ! z1 w9 a, X( v+ N5 x5 f double t = GetFormulaVal(FormulaNum,FormulaSym,num) - sum;+ I/ F- ?8 }+ K9 y if(t>-0.01 && t<0.01)) ?& f" C2 t9 V3 n& B) g {, V! V/ Z4 P" g //printf("%d %d %d %d | %d %d %d ",FormulaNum[0],FormulaNum[1], ! B3 G: ~; H6 B" X* X //FormulaNum[2],FormulaNum[3], ) k% _. k% D# h! P // FormulaSym[0],FormulaSym[1], - {1 A3 ]2 ]* \3 [& F // FormulaSym[2],FormulaSym[3]);+ y, w: y4 O* ^* B8 Q ShowFormula(FormulaNum,FormulaSym,num,sum); % ?9 o) {/ [" K result++;4 m; W# M+ ^1 R) O8 S } 4 o$ `& ^1 K. F% Q8 X' Q: I8 N# e- {" y 0 W9 D( [/ q* C) n // 依次穷举操作数 6 T) ^, |- p( L% E @ 5 R. {) a& h, I5 e //允许数字重复的穷举7 J& [) S. Y: U* y9 v //FormulaNum[0]++; 9 g; A: v. u! [+ v1 E. J //for(i=0;FormulaNum > max && i + j# U r5 x# }7 U //{4 o& a/ Z5 R) }' w2 P- @ // FormulaNum = min;6 T X5 ^3 F; ?" x$ B // FormulaNum[i+1]++;- s) R7 v2 \2 Y4 x! } //}+ Z% T8 m+ ]3 r0 L // 操作数穷举与操作符号穷举联接 5 r9 V, t* m! o //if(FormulaNum[num-1] > max)) [4 s3 d6 N& ^& B; j //{ F, |" y2 z6 \3 ^2 L // FormulaNum[num-1] = min;/ a% w2 }' a+ ?" d) V // FormulaSym[0]++; * Y& Z, @, i B& m; C% w //}* n0 E* i# C- g: j8 }' v i, G/ s' K# q% F3 i6 V // 不允许数字重复的穷举 & d- S9 p6 |2 A // 数字必须从小到大的排列,防止重复. C2 y: S4 Q2 t3 E if((max - min)< num) exit(0); // 出错+ a8 ~% ]' E( h$ h4 W5 D ' p1 v Z$ I9 p if(EnumArray(FormulaNum,min,max,num))$ A$ G# v# O1 r* L { * Y% d: C$ V, s5 f FormulaSym[0]++; 3 x( m1 ^( a* ?4 r# p# \ l& D InitArray(FormulaNum,min,max,num);6 ^5 h2 Q6 {5 S x FormulaNum[num-1]++;8 Y8 z# M; p7 W1 K# _ }5 C# W* t" W0 K; w2 J$ ? ) a! q4 X/ r/ O+ F) `; P" d // 操作符号穷举 , i. Z# u- `' d4 b for(i=0;FormulaSym > 4 && i6 t' t. m0 w0 g Z; j# l& f, | { 3 r9 M! M) E: e3 D9 F) n FormulaSym = 1;( q& C8 {2 |9 W. Q! Y% w/ H- h FormulaSym[i+1]++;& z- P) H3 y4 W* M$ h6 S } 0 ~# ~- v' I# x" R8 Y* U! ]( g5 H$ p, ?& V3 L" N; m o2 ?# @. y z }" G2 k) J8 \4 n: F //释放空间 4 Z$ x: q; t4 [! j( H$ L2 ~ free(FormulaNum); + ?. v/ S+ p! M. ^6 Y free(FormulaSym); + W$ W% C8 C$ H% t$ Q- q8 ], g return result;# \3 B7 n/ A, C1 y- R* ~* x- ~9 K }' `# B- u' R; `8 ^) q0 } // 计算算式结果3 K! `, x, n# ?$ H double GetFormulaVal(int *Num,int *Sym,int count)& @9 K2 J# `" x) {+ P5 O { - F C2 C6 }# z2 A$ T% \9 Q, N2 \- u8 _ int i,j; 9 G- T" b" n' b1 [' H, L0 T double preresult;. `: ~2 ^2 k$ t3 Q% I3 C preresult = Num[0];, s" G" p8 }* ^( k$ ^4 P5 a$ w i=1;j=0; & a* f; O. P! u$ x1 u while(i8 G7 T" f2 P h; E- v { % y0 K# g( f0 M/ K switch(Sym[j])1 a/ a' x$ j$ W9 L* z { % Y* @7 l7 ?7 H2 a9 U8 n case 1: / R) j9 b& m. l) I' K preresult += Num; * m: Y$ y } W3 I- D" G break; ; {8 A- _6 Z& b1 w, i5 p case 2:% H9 i; o p) [- X1 [' \ preresult -= Num; " \6 h% N4 d8 G3 q9 }: q0 k break; $ \, p0 d% b+ P( v* a1 ~3 |! ?% t case 3:7 Q; m7 z/ H8 v6 b# d preresult *= Num; # D9 F' g4 U4 ?' d$ M break; 6 `1 Z- _: O+ g: s& b case 4: . _$ h, _3 P k3 {7 \' n7 X if(Num == 0) return -1000;3 x( y$ M. G" J0 |* ~* H1 Q preresult /= Num; 5 p9 I4 n: C" b3 n break; 1 |+ ~# c" f# |! ? f8 t3 k5 `( f1 D } 8 t5 E" L, h, d+ i3 y i++;j++; 7 H4 d# L) w% u& y* P } & w$ |4 W3 @0 h return preresult; //进行修正 + m5 E S$ l) G2 `} + m7 U+ g1 B) N4 K5 t' s. @0 I// 打印算式 4 Q: X8 p( q2 d# ~" U# {- S: X+ M J nvoid ShowFormula(int *Num,int *Sym,int count,int sum) 7 U2 V: u5 A0 I- U6 m! D{ 7 e0 a* }" Y0 R. K , Y, G0 w, r& N- P( I8 A int i,j,len;: ]& G3 c* d. D0 ?5 q5 y* R6 s8 |% n char *Formula = (char*)calloc(count*4,sizeof(char)); 8 [% w; v3 r8 t) E2 P8 T1 H char temp[10];( {) s- s0 U. g! @2 l1 { itoa(Num[0],Formula,10);% |9 X. c' C8 t h) O4 r9 s i=1;j=0; % e: r% I( c1 w while(i' i# M1 E, _/ J! p% N4 c {( J, A& f; _9 ? itoa(Num,temp,10);, `( t0 l) [1 W7 P9 e len = strlen(Formula); % A; b+ { a' a; L switch(Sym[j]) ' M# b4 j. s, a' ~/ ?( ` {+ J4 D2 N* m# h" ^# w& l/ @/ M8 X case 1: $ C7 j8 w# [; C% R% c9 U4 } case 2: 0 z( P; l% w' D! U7 `; \+ m Formula[len] = cSym[Sym[j]];- G3 h3 D( g3 t" A0 ?9 r$ H: g$ G strcat(Formula,temp); ) r/ L! z/ m! ^ o7 L4 I0 o break; $ @. i0 C; K# ^4 h7 A! M case 3: ; L8 c: [2 Y2 |7 b case 4: % z$ e, g0 @! P ! u6 B' H$ A: t; A4 u // 如果上一个操作符号优先级低于当前的,应加上括号7 p. Y5 ~! m0 ~9 u% c if(j==0 || Sym[j-1] > 2) G- \0 b% d, I" p {4 y( b5 {2 C# D( `6 W: m) q; ~ Formula[len] = cSym[Sym[j]]; $ s U6 k/ K7 x strcat(Formula,temp);" |: `, }" B1 ^7 s5 @ }# k* b; S3 X' _ s$ o; `- d J else7 B5 t2 }1 o3 r9 ^ { ]" @* M# v; o$ M int n;: s% M0 V m9 j' X char *FormulaTemp = (char*)calloc(len+1,sizeof(char));) n. y. _0 D6 b: n# w6 f for(n=0;n, [" ~; I) j3 i {2 H5 s3 Z# C4 Q) J/ q FormulaTemp[n] = Formula[n]; 0 V/ \$ J" Y" g! S, Z1 X5 d ^ Formula[n] = 0;$ D$ W" |! l" \% ? } 5 T I9 `% c M# U7 ^+ v: p1 Y) h Formula[0] = '('; ' H% d ?, w/ a- l( G3 h. G strcat(Formula,FormulaTemp); + w3 o. d% @% h4 h' C" ? free(FormulaTemp);, Z& i# v2 `5 s0 } Formula[len+1] =')'; 5 }+ [" b+ J9 y! p* C- R+ P& {5 B Formula[len+2] = cSym[Sym[j]]; ) j% _' K6 l9 r0 Q' a9 e strcat(Formula,temp); 4 K) K+ f3 p, ^3 B0 P+ }0 F* Q" q }" \5 i' }* r: n8 S5 S2 L+ h break;. I$ _: E/ J/ h' U } v* B, ~. R0 ]* p7 C i++;j++; 0 v1 y A. h3 R+ I6 ^1 Q2 t1 l6 B; ? }: {& k- {6 E. H7 G6 u printf("%s",Formula); 5 ~, m# A3 l' j printf("=%d\n",sum); 9 r4 P$ X0 S4 i( r/ J2 a, _ free(Formula); x( p" n3 e1 _6 g}3 L2 e; K' y6 N1 f; f, y% L* u# L ( J$ s) F& x0 B) n; i0 ]$ R // 以当前数组为基础得到一个从小到大排列的数组 ' `. K d+ S' R- c2 F& h* z3 n// 返回非0表示穷举结束% x9 q4 x, h4 {' J! Q1 R int EnumArray(int *Num,int min,int max,int count)* q' ~3 H" ?% d, e {, a5 G' ^$ @/ F- c$ Z int i,top; ( N* Q3 B; k$ }8 r top = count-1; 4 ^$ |8 e, j. N* Y+ W# x Num[top]++;# [% I5 T( e% m3 S1 ?6 ]3 [ while(Num[top]>max-count+top+1 && top>=0)5 S( m/ s* y, J { 7 a3 e3 I: ~4 k3 _% h3 O3 G9 m top--; * p% O7 x. ] H* _( O3 U7 {' Z Num[top]++;) L- z! p: f) P6 Q8 y# e! X } , X" u6 J" Y) o4 k for(i=top+1;i. j7 I' Z; V0 O" q {: s' }& c {$ t% ?/ G Num = Num[i-1]+1;' l, _; D) \8 x4 b: R2 A! F }. U) O( y: W+ d$ x$ t+ }3 d w if(Num[count-1] > max) return 1; ; J, L1 Q" Q4 d! m! t else return 0;% b/ Z0 i* }& c, k/ G }- u/ a0 {; A. Q. p1 O j . D2 x' d0 R3 a! _) }! h/ o // 不允许重复的初始化数组7 w l! c+ H9 J, u( z8 |9 D% X# h8 h7 e void InitArray(int *Num,int min,int max,int count)6 Z( F% L/ V* u6 [# l+ X2 _. w {2 X$ F) K: t0 }; V% e6 A int i; . V! u7 u2 P4 Y: Y for(i=0;i=min+i; 1 |4 [2 j+ z9 q8 k, j* W6 ] Num[count-1]--; 5 C/ x/ i z( G}! ]' w% Q4 { e* t/ x 3 g: f. u; A) R; C- [ % V) z2 U1 j' l; Y; k ; p, H4 A2 m) T8 V8 p0 A( N) ]# Y8 r3 X
    [此贴子已经被作者于2004-5-2 14:50:47编辑过]
    : X7 t" B2 `( O: Y3 B! V$ {2 y {

    该用户从未签到

    11
    发表于 2004-5-2 14:54:00 | 只看该作者
    本法穷举出所有用min - max之间的num个数组成算式,结果为sum的情况# `3 p3 |+ a' d, l

    ) u+ s, A9 Q8 Z; C  {" m# [如要具体的话,可以不穷举操作数,直接输入操作数,进行操作符号穷举
  • TA的每日心情
    奋斗
    2015-9-17 00:58
  • 签到天数: 1 天

    [LV.1]初来乍到

    12
    发表于 2004-5-2 15:17:00 | 只看该作者
    以下是引用游侠无极限在2004-5-2 14:41:26的发言:+ F3 o: Q( `: C2 X4 F0 B #include & f9 O y. z& v% f7 q% `$ r #include 8 Z) I* W- o' e7 r% n! V$ L0 Y3 @/ w& R R! D6 k' }3 } int EnumFormula(int min,int max,int num,int sum); : X; z5 [9 G# o7 a, I3 T* R void ShowFormula(int *Num,int *Sym,int count,int sum);/ L& o# s3 O I( N# Q& k double GetFormulaVal(int *Num,int *Sym,int count);- k5 [) Z- I0 j! h! r8 d$ I. T int EnumArray(int *Num,int min,int max,int count);3 X3 A2 w' n4 n% e9 Z void InitArray(int *Num,int min,int max,int count); 9 L% b3 S+ Y9 C% d5 {/ @ e. ? const char cSym[5] = {0,'+','-','*','/'};5 w9 Z1 ?5 E2 S" e; C 5 h, Q& t* \7 T4 o6 Z# h int main(int argc, char *argv[])) J" w" Z9 W& r7 \+ C: H+ K {2 ?6 l5 c+ J* A; [' ^, k, |; ]' I printf("总计%d个式子\n",EnumFormula(1,10,4,24)); 5 U" D% s0 C9 u system("AUSE"); ( z/ z) Z0 G1 H return 0; + C0 q7 [+ _4 R2 j } ! j8 w8 f0 a0 i/ w; h( T4 X7 L$ p8 f H int EnumFormula(int min,int max,int num,int sum)* x' {( R+ {$ r. E { % P3 P9 U# E6 a; R6 X) T0 I" Z int *FormulaNum = (int*)calloc(num,sizeof(int)); //储存操作数 ; {; C, @ {3 |' x //储存操作符号9 t& G8 M. H' r //最后一位用于穷举结束标记: x6 n; T9 Z' x) J4 s W, ]# Z // 1 - 4 代表 '+' '-' '*' '/', J H6 S1 Z4 n, t1 F* R8 g int *FormulaSym = (int*)calloc(num,sizeof(int)); ! h, }) I8 I, k3 o4 R/ l $ F2 E* K h" H int result = 0; 0 f7 i" V! ]) U K. ?7 y( h // 初始化操作数和操作符号数组 2 {" c$ E0 u( P: ]5 F$ Q6 ~" t1 K 7 o9 m1 n* K. h+ G | int i;1 \( B( X# [' m" ]8 p / {8 N" G7 T& z: a; f& x for(i=0;i = min;2 p8 A& j) b9 y- ]& p' R for(i=0;i = 1;8 s5 H+ V+ O" p ?9 m$ }2 h FormulaNum[0]--; , L( M5 G- i8 E+ S 2 E2 t% ^2 n/ } InitArray(FormulaNum,min,max,num);5 L+ y! r+ _/ O0 x% y$ j7 G FormulaNum[num-1]++; ; y) n' Q0 }, U0 L6 d! d // 穷举操作数和操作符号组合* l, Y" y* T2 ?9 l, ]! G3 s1 N2 m' W1 w while(FormulaSym[num-1] == 1)1 r2 s; f# L3 t3 N' q1 t# ?7 n9 M { 8 k9 P" H, y* \ double t = GetFormulaVal(FormulaNum,FormulaSym,num) - sum;; ^4 d+ p8 O. s" Y2 z% d e, I4 U if(t>-0.01 && t<0.01)! c5 Q. H8 U- N: `0 @" s {, K+ Z! r$ \/ B2 f; Q: L //printf("%d %d %d %d | %d %d %d ",FormulaNum[0],FormulaNum[1], . ?- W, h; N9 j/ K1 s" a/ N //FormulaNum[2],FormulaNum[3], ! j0 X' Q/ ?9 F- F+ M9 I // FormulaSym[0],FormulaSym[1],) w* H' s( K8 s% i, r0 w- f // FormulaSym[2],FormulaSym[3]);4 T4 A% c; k' v1 x( r. e3 d7 A ShowFormula(FormulaNum,FormulaSym,num,sum); . O1 q2 B5 Q6 Y result++; 4 F: J; e1 F5 s9 | }8 u D1 t" o" j L. ]+ o0 `3 o5 J6 x" t // 依次穷举操作数 $ Q; S) M6 X$ t5 D- h8 k " C4 w, \7 S; g0 x& D- r //允许数字重复的穷举 , P2 W. ^! ?: z# c5 z* Y& E3 {# D. h" D6 J //FormulaNum[0]++;: D9 F0 m x; y+ f' V, R //for(i=0;FormulaNum > max && i' p! l T( I# E! h& v" ]# \1 @ //{# G+ |( C# I" k2 w3 b9 L // FormulaNum = min; ! U u* t- O# _6 `/ D( B7 }6 i7 C6 o& i // FormulaNum[i+1]++;7 a' L+ g7 q5 {+ o# k2 [7 {+ r2 X //} 2 e* s3 U1 R- h& e: M5 s // 操作数穷举与操作符号穷举联接 3 _, U2 C4 r3 v, ^: y5 M //if(FormulaNum[num-1] > max)7 U3 t' m I- S. v, U! v //{2 K. @+ g6 c1 ^7 @ // FormulaNum[num-1] = min; / G+ u& p# t2 s9 A // FormulaSym[0]++; / R6 Z, N6 @" }( ]9 Z //}$ p! t+ i" S: m% M1 H0 _. z( u( s ( k" V1 b0 S7 D$ B+ c# x // 不允许数字重复的穷举 , C1 w' w/ ~% m2 I // 数字必须从小到大的排列,防止重复5 k3 [1 g" @2 j+ M, N( i2 F' q if((max - min)< num) exit(0); // 出错 & |) n, @% O7 `+ f) i7 v: j) N" z1 `7 x1 O% U3 w- z if(EnumArray(FormulaNum,min,max,num))5 X" I" p7 `3 a5 A { . j8 g' K9 \+ y% v# p# U6 O FormulaSym[0]++; * x4 f) S4 f4 p+ m0 Z- h InitArray(FormulaNum,min,max,num); 1 \8 t; Q' k& n$ N% ? FormulaNum[num-1]++;! o# ^4 ]! m( u' { } 9 a S5 S; E, F* N/ ?# B1 }$ `8 V & B4 A0 r' A3 D7 z& n' F6 ` // 操作符号穷举 ) Z5 x9 l, M) u7 f: `. t for(i=0;FormulaSym > 4 && i/ X. w% E0 y0 ?6 \) G {4 E. z6 t3 y3 h" T6 I% L! [ FormulaSym = 1;) t4 i& v. w! P! X$ d' H FormulaSym[i+1]++; % g7 |, H o/ l: A4 c }( ?1 }0 y X( Q( Y2 I+ C7 [* |/ Q5 L ) y! x" O5 ^9 `- L) b6 u# w; E7 W }0 c! n, S0 {' \* |& O6 ^ h) `5 z2 _ //释放空间1 j, w6 B, q h- M( S, C" W% A free(FormulaNum);2 f) V/ e5 G5 E free(FormulaSym);4 f) H+ M: W. r' \- m) \ return result;. G/ ^/ F, P6 w7 Z# q3 Q+ G } 3 V0 j3 }% e @* p' d; T // 计算算式结果 ! |( f0 u+ P% M8 n% p0 V double GetFormulaVal(int *Num,int *Sym,int count) / ~; o- s) e* M) v- H8 R {; u! k! A: K/ F# a2 X; b int i,j;( p0 G. z) Z1 `5 S; |& M) v double preresult; . q3 ^* g! e7 ]6 a! N2 k preresult = Num[0];- U9 }. d2 k; b. q$ l% Z i=1;j=0;' y8 T3 E- P' X/ a while(i7 J; U& }1 y+ w- C6 J { 1 p. P& F# h5 K! x3 L. l; `8 B switch(Sym[j])! T* k- @0 }' a {0 m9 e3 b9 \ C case 1:5 a; ? `5 R0 M preresult += Num;/ d# ~5 l& b* ~# \; [8 R break; 1 k& N/ ~* K1 w# }8 ^0 v1 y case 2: ; b+ b" ]) L8 X) C preresult -= Num; 6 ]% F2 `0 r% L6 D5 y2 Y break; $ x3 q9 D7 L' R- i# c case 3: 3 }, R6 m4 Z4 |% }: s preresult *= Num;# w9 M/ W% ^1 h break; ]; [( f4 Z$ u) d R' u case 4:: j- j. S5 e* T6 b/ W: W3 ? if(Num == 0) return -1000; + t8 M6 L" V, W" t preresult /= Num; 2 V0 w# E8 a% h! T break; 9 t: `3 d8 [( N3 L8 U } 4 @. b! v; }8 ]8 R4 _ i++;j++; 5 C/ L/ V/ |1 Q! x# `, K } 9 U& Z; o& Y3 f$ W return preresult; //进行修正 , }8 P" [0 ]( P }& w7 M- {$ H+ R) M& {+ a // 打印算式 4 b o g( j: s& F7 h T void ShowFormula(int *Num,int *Sym,int count,int sum) 3 G" Z& w$ S9 \# P3 u s; W3 Z {# [# j, h, z: n7 J4 F' d% O0 X : z* S5 J2 l+ r int i,j,len;$ u% {3 V$ [8 M- P; ^ char *Formula = (char*)calloc(count*4,sizeof(char));4 T5 q0 H" c" w/ i! f char temp[10]; & v% t4 ]2 p9 N6 ? itoa(Num[0],Formula,10); ! w0 R( b3 A7 ~, A) `0 F* I+ i& \/ W i=1;j=0;9 d* K7 e, y( s" v! x7 o while(i1 `- d9 G7 v* e- q) K% R. _* t2 a {& D1 G% d; ]+ k1 P8 ~- L itoa(Num,temp,10);+ W* I: z! K. b" N len = strlen(Formula); * I4 K, H+ r4 O: J4 i' m switch(Sym[j]) . ~) q) t6 M" u+ `4 B B6 ^ {$ H* k+ B5 k0 N( K& d case 1: ; A) V( y. w; c4 K4 U case 2:3 J G8 g0 }; ~1 Y/ a Formula[len] = cSym[Sym[j]]; 9 R3 F* I- }; q' \ strcat(Formula,temp); ; V' p1 ^) Y+ }9 X" z break; 2 W8 [, V3 Y0 b7 D4 F3 P: i case 3:" H7 j+ i1 m% h8 N' ? case 4:2 R' k0 ~9 |) v2 P9 A " s- }- B/ a9 g6 Z // 如果上一个操作符号优先级低于当前的,应加上括号 ) i7 O# Y& M* i _: c if(j==0 || Sym[j-1] > 2)3 k( b ]) F7 Q4 G4 J5 f { 7 d+ f9 U ]! e" u7 ]" D Formula[len] = cSym[Sym[j]];! H9 V' C( X. p6 o" I1 E& H, S strcat(Formula,temp); 6 W: o6 U: b' a S$ f }: z9 U* P. E: @, y2 }# s% v else 2 M0 O0 B! g* |; b& N) Z, W: u { 8 x) X6 u& t- i) N1 @ int n;, r# f3 H5 n1 N8 j' B1 i9 \0 g* S char *FormulaTemp = (char*)calloc(len+1,sizeof(char)); 6 Q* H' J G! r# G" T% ?: t2 F for(n=0;n4 h. o' Z0 `9 ]8 H { ! |4 N5 ^/ B5 J& m7 u; K' ]6 t FormulaTemp[n] = Formula[n]; ) x8 v: Q0 V S, B Formula[n] = 0;& U! f: ^) B8 u+ M } & o8 f6 g k7 c% y# m k0 j& s Formula[0] = '('; ! u' l' t2 N# i- ]: R8 T5 C- r strcat(Formula,FormulaTemp); 0 H' q9 E F/ l9 S9 q free(FormulaTemp); ; S$ `: J: v& p, W Formula[len+1] =')'; 3 K: `1 \3 d6 l/ E& `1 O5 {9 g( e Formula[len+2] = cSym[Sym[j]];6 J' W$ W% U5 _# G strcat(Formula,temp);# j5 u2 e) c0 V: _! O$ Z( d } 2 R, p6 Y+ N$ U7 \; D break;0 a! M E! h1 B; i- r0 v }! I5 y+ v+ p% {0 x: l i++;j++;# m& _/ k. Q: ]2 U }6 D. M' V6 v5 Z3 o' V4 G1 i printf("%s",Formula);% V. k& c5 ?: p. \ E printf("=%d\n",sum);- I, A8 q3 h2 U, g/ S$ e" k free(Formula); * ?8 |+ ]+ V2 F* p5 z: F! @ } ! s) f( l Q& w" z9 M 0 i0 H, N+ G7 R. j7 w6 d // 以当前数组为基础得到一个从小到大排列的数组 c+ _2 U' o: B3 Y5 U // 返回非0表示穷举结束 ! f0 @: l0 s7 w, o# t int EnumArray(int *Num,int min,int max,int count) " H% U0 W8 V( h, Y+ U8 L { . o/ E5 |8 w- U z) F int i,top;5 x- ] u: n' H# }9 O( | top = count-1;. M6 O$ Q4 O; \- e Num[top]++;1 U% U" n/ @! m5 ^* X& D/ E, | while(Num[top]>max-count+top+1 && top>=0) / w$ M9 b6 }1 F7 l { 1 l5 J6 f8 F7 H# O4 y top--;% W. L% i- ~6 |9 w/ e. U* p# R4 }% O7 C6 @ Num[top]++;- ~8 c8 i, ~* r: @7 I7 d }" o& y7 J6 N& I/ n/ i for(i=top+1;i' W; P! Q; h! Y) c# G {, G! @3 Y0 U1 N' q7 T" h, D Num = Num[i-1]+1;: E/ s4 [; E" ^/ ~- u }5 N% R/ {8 M& k! g( J7 A if(Num[count-1] > max) return 1;7 \! M% l6 w: W) Z else return 0;6 U5 w( t" k/ g# I0 ?0 ? } % A9 _5 e1 w1 d: O" p 1 V, y- @( ^5 | @- i // 不允许重复的初始化数组 3 y- i' r' Q7 v# h# S6 j void InitArray(int *Num,int min,int max,int count)5 R. j% f0 o4 _1 o5 Q. |9 U2 c {, Y9 G" p3 Z- D: } int i; ) z; L, C) `1 z | for(i=0;i=min+i; 4 x$ C! u, R) ~ L7 T- l Num[count-1]--;9 {& W; R5 B; ^4 P: ]$ z0 L } * W* R5 X! a4 A' H" W) g9 K# a+ ^4 S; `7 S# R ) b& J$ v8 M( m8 {, q( w ) s- p. v9 r% B8 a; t5 A/ j ) o- ^0 L. O$ Y+ |+ G
    [此贴子已经被作者于2004-5-2 14:50:47编辑过]
    " @' ^/ E$ t7 E 6 v5 `" U, L: v4 W' } printf("总计%d个式子\n",EnumFormula(1,10,4,24)); 的运行结果是:. p8 l- L ~! Q/ |( Z2 J 1+4+9+10=24* b" {- }/ z0 l6 |. u 1+5+8+10=24 9 M( s9 Q! G7 [1+6+7+10=244 q3 p0 u& j6 H" n, Z4 ?! ]- [ 1+6+8+9=244 k; p' S6 `: Z& d; D; Q 2+3+9+10=24 ) w0 ^+ Z6 {6 o* G2+4+8+10=24% M; y/ P! N0 [% z1 w 2+5+7+10=24 8 B [8 e3 Y" f# \2+5+8+9=24 $ j4 h. F" ?* g% l2+6+7+9=245 S- |4 d* p5 ~6 r) l O6 ^4 c: Z 3+4+7+10=24 ! \* X- S$ H" I( H3+4+8+9=24 3 y, n# v4 C% u9 T9 x) S$ x7 A5 I3+5+6+10=24+ \8 s% \* H* r* ~ E) Z 3+5+7+9=24$ l3 x) |+ K) s, u$ w; J: @$ T& d 3+6+7+8=24. g. i, M5 L6 p 4+5+6+9=24 ! t$ c4 q( ]* s* v& G1 p4+5+7+8=24) i$ L( X) S2 M+ r/ K- A% x+ | 这是什么意思?似乎是找出了 1 至 10 之间的和是24 的数据,这和完成计算24点,差很多吧? 5 }( B+ X0 D/ c6 X4 b+ ]比如用户输入 2 ,5,7,8 程序应该能得到计算这四个数据得到24的表达式才行啊,这样就可以写一个游戏了。4 a7 t2 O6 e/ f 如: 1,5,7,8 有如下方法可以算出 24 " m: e4 y, S: Y" V# s% W((1+7)-5)*8 = 24# A( j* x1 E# _1 U" n3 } ((7+1)-5)*8 = 24' E8 @: f0 W3 n) Y (1+7)*(8-5) = 24 # _/ ` D; c4 c(7+1)*(8-5) = 24 8 L7 _% I1 g' h1 H0 K3 S9 y0 e((1-5)+7)*8 = 244 l! B* F0 Z8 `/ \ ((7-5)+1)*8 = 243 ^4 L2 D7 w) x0 ~4 D (8-5)*(1+7) = 24 ; x+ ?" h/ m" B* @(8-5)*(7+1) = 24 ) F- @5 G1 g4 } O" w8*(1+7-5) = 24. n# ?& e" o& { 8*((1+7)-5) = 24- l# i) x% |6 L 8*(1+(7-5)) = 24 1 r) R7 e0 p4 Z# z3 I8*(7+1-5) = 242 E$ x) U1 m4 a, L) N 8*((7+1)-5) = 248 M. n5 e: d* a' K' n 8*(7+(1-5)) = 24 6 M# N3 L- l9 m; I2 V8*(1-5+7) = 24 8 m" L" @& \* r% c8*((1-5)+7) = 24 3 P0 N' D! e2 l0 Q' w8*(7-5+1) = 24 ~" u6 y8 k& T# {" m/ u8*((7-5)+1) = 24 j5 n$ @+ Y+ y& |" n

    该用户从未签到

    13
    发表于 2004-5-2 15:21:00 | 只看该作者
    结果是这样的:
    $ L! f8 m6 D1 Y, n% ?5 _8 X) [1+4+9+10=24; D0 T' p. G+ r0 e
    1+5+8+10=24
    4 Z5 r( `6 v6 w( ~1+6+7+10=24
      s# {1 |( \8 g5 e  j' D; J1+6+8+9=24% Y4 e- @+ t% C8 C8 ]" C
    2+3+9+10=24
    " N# u8 N, q4 q% e2+4+8+10=24( U9 U3 ?7 Z: o
    2+5+7+10=24
    8 U9 f$ I  v. a0 a+ f2+5+8+9=24
    1 f0 _( J" l' y, Y# K0 b8 l3 _2+6+7+9=24& L4 K5 @2 w/ w7 H& y- W1 A
    3+4+7+10=24
    - w3 i. K1 E+ `& L3 f3+4+8+9=24$ k: G. e+ V: ?6 P
    3+5+6+10=247 N: H4 C4 w7 a1 c( i
    3+5+7+9=24! F' }9 T' G( h* A$ C
    3+6+7+8=24
    ! p1 s! i& h; Z! x* @. a& U. e4+5+6+9=24
    9 u( a$ ]& m5 \4+5+7+8=24! B  K- ~! _) t! F7 T# D% s* u% Q
    1*5+9+10=24; V# j! i' s5 {$ ]8 Y# n, n3 L* I8 ~
    1*6+8+10=24
    ; z/ B1 f+ ~+ S1*7+8+9=24
    8 \2 ]7 h# Z: b% M; c. G2*3+8+10=24# i0 P" O- [7 _
    2*4+6+10=24% @/ T0 g# W8 _# f" y( U6 H% }
    2*4+7+9=24# N" r4 u' g' O
    2*5+6+8=24! u  {) u6 y3 W) k, y( K$ t
    3*4+5+7=24+ ?- |2 Z* z; u
    4*5-6+10=24
    2 O, {/ h- J* s; t(1+2)*5+9=24
    $ @. Z9 m1 K4 Q  N  d% F(1+3)*4+8=240 Y* R9 |  L0 Y- \# t2 B9 c& W
    1*2*7+10=24$ I) g$ J" g8 ]. v! _* O/ `
    1*3*5+9=24' s% v" v" {( |& r
    6*7-8-10=24
    5 D( M2 V: A, G3 O(2+4)*5-6=24( k( q, e, _5 s: s! k
    2*3*5-6=24) b  x1 |5 m: t& q, u5 H: u' `
    (1+2+3)*4=24
    ) ~( C( O0 K/ R. H2 Q, ~- }/ W(1-2+4)*8=245 |9 `0 P' L, i0 J; f4 G1 Q
    (1-2+5)*6=249 J' U& {& S- u9 i+ i% D1 a
    (1-3+5)*8=24
    ( z/ S3 k; _  k! q( Z(1-4+6)*8=24
    7 p) g, l5 e2 D# O(1-5+7)*8=240 I& R. T5 w$ B, u/ y
    (2-3+4)*8=24% L2 |' S8 h4 i1 Y/ S/ \
    (2-3+5)*6=240 |. ]8 n4 M6 U- F, u
    (2-4+5)*8=24
      K& r3 D+ i1 w3 F; M(2-5+6)*8=24# e" P' s& r' `. x  z
    (2-6+7)*8=24
    1 j; e. v% [2 A3 K( V+ _(3-4+5)*6=24
    4 j5 {& n9 m0 X# p(4+5-6)*8=24
    6 n% e0 ?! _3 N(4+6-7)*8=24. L4 d  ^+ E# y9 R: `3 }
    (2*4-5)*8=24
    0 n; w6 y! j) v5 l# \4 Q# J' f(2*5-7)*8=24
    3 ?& i* y" l0 g& q0 ^3 p1*2*3*4=249 Q; F, N- w4 D2 E. P
    1/2*6*8=24
    - U4 I( x* J: j: c0 D9 l1/3*8*9=24
    ' R: {) G/ ]1 k8 n2/3*4*9=24' I) j$ p1 ~) D0 x3 X& h2 P( ]
    2/4*6*8=24' x" R* M" \: [: n: K. n0 p
    2/5*6*10=24
    ' d/ r1 O" x( i1 T( C2/6*8*9=24
    ! }: [* W( Y5 S0 P3*4/5*10=24, T! V; y1 v# Q" D: s) U
    5*6*8/10=24" D& j* l  j6 Q# ]/ i, |# Y; U
    总计57个式子

    该用户从未签到

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

    [LV.1]初来乍到

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

    [LV.1]初来乍到

    16
    发表于 2004-5-2 15:28:00 | 只看该作者
    (2-1)*3*8 这个算式你就没有啊,这4个数字的组合都没有出现
    ! g" ]. D: z1 s) k  R1 Y! q  a8 R% g
    3 X# A& K  s: R! U' p! H# b7 U# c+ ]% j/ C! C9 w
    & l1 F2 g  S6 b4 P# ~
    " Z7 g0 S! ]( g1 ~( I( [! w+ B
    # O6 U8 D1 S4 P" \$ J' A' z. Z
    : _; D4 k7 s$ s- e4 N& ^8 A7 {
    [此贴子已经被作者于2004-5-2 15:32:12编辑过]
    9 e) f/ F6 [. X* D1 r# a$ X7 l. f
  • 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 | 只看该作者

    6 Q* V: `# @' Z" o, t5 Z. m4 T: b7 q: R7 [% S9 e5 L. W
    用这个好了,只不过输入的时候要按从小到大
    * Y3 l; Y6 S: o1 l+ A
    ! p3 i( c# T+ I好象有BUG,我暂时不太清楚

    该用户从未签到

    20
    发表于 2004-5-2 15:38:00 | 只看该作者
    以下是引用yzhlinux在2004-5-2 15:28:15的发言:
    8 }2 M  Z* H' j4 m( V  c(2-1)*3*8 这个算式你就没有啊,这4个数字的组合都没有出现
    ; v; {6 l" m, {& |$ f. j( Q

    ( {4 ?* \" Q! K! x8 Q本来为了防止诸如
    / L* C/ e7 ~* Q( u0 d# |1*2*3*4
    ; E* {- n! o/ s; m% N, |$ X1*3*4*2
    # B. `0 h7 `% X$ q! K2*3*4*17 ^) Y3 v& I3 Q( J
    等的重复,只使用了从小到大的数组,不过这样好象也丢了不少可行的式子) g7 I. [. I' q) K6 {: e5 a

    : t6 L) c1 L: F% k( U- b2 W另外你的程序就是有这些重复的# x/ z0 L+ v, W- B, @
    - P" a7 w: l2 o' T" L+ e
    PS:VB的程序感觉就是慢好多啊
    7 t+ I0 n3 w( R8 X/ W# W1 `
    [此贴子已经被作者于2004-5-2 15:42:01编辑过]

    * @- t% ~( n# Z( Y5 W$ s  y; i  b. F

    本版积分规则

    关闭

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

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