下沙论坛

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

QQ登录

QQ登录

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

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

[复制链接]

该用户从未签到

跳转到指定楼层
1
发表于 2004-4-27 17:53:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
就是扑克里的24点游戏,4个数,+-*/得24……: T; G  \. E( L3 @2 N
1 m6 o' D* z2 w6 f5 Y% f- i$ }0 q! H
偶还在想……
分享到:  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的发言:
    ) r/ S) G) |3 E! L. n* J穷举法吧

    " s4 D# K& ]* U那你的代码要写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 则表达试就是我们要求的了。比如:# i6 [0 b1 A0 q. X
    function GetMach(A,B,C,D) as String       '得到一个字符串组合如:(A+B*D)-C
    1 d8 |( z8 g8 B1 Wfunction GetValue(MachString) as Float    '得到字符串的计算值 ,可能是小数
    - E% H& n3 F/ E2 j* m那么程序就好写了:& L, ]4 O/ @! w+ _& |) y9 a
    GetNumber(&A,&B,&C,&D) ;    '得到ABCD则四个数字,赋给A,B,C,D四个变量' V" E9 ^* K( ~9 P
    do{
    3 q: z6 E. p7 E0 a1 B  MachString = GetMach(A,B,C,D); '得到一个表达试的字符传0 j! C/ ^  h( ?+ j) G( \2 P  d
      if(GetValue(MachString)==24) break;  C% \9 _+ D& g! }
    }6 h1 b# \# B  ?. n0 _- T
    print XXXXXX;0 d/ n$ _, q) l/ ^* E3 i& w; w/ V

    该用户从未签到

    7
    发表于 2004-5-2 11:57:00 | 只看该作者
    我现在试着在写,就是不知道有什么好办法解决重复的算式问题,比如( M& B2 E- ?" a
    (5-2)*8*1
    6 L& Z' Z/ ]* U
    $ [6 s( O8 q, j" S(5-2)*1*8
    ! U' [' M2 v. F7 V& S8*(5-2)*1
    " y  g$ I# G/ a( S3 B7 p9 L/ E等等
  • TA的每日心情
    奋斗
    2015-9-17 00:58
  • 签到天数: 1 天

    [LV.1]初来乍到

    8
    发表于 2004-5-2 13:17:00 | 只看该作者

    # n- [2 k6 j8 h# F% [( M$ u' \2 ^: {& ^# N$ F. ?; f! e/ a8 D
    花了一个上午,终于完成了
    , F, k8 r7 w+ y2 Q4 c) f你参考参考吧,哈哈
    % K& i. h) v7 }5 ^  b1 C
    ; b$ S$ U2 Z$ m+ }1 }. l: l0 v1 r1 ]( [- k" Y9 W- J5 a8 w1 c
    [此贴子已经被作者于2004-5-2 13:43:13编辑过]
    ) A; f( r, m3 l8 z* L
  • TA的每日心情
    奋斗
    2015-9-17 00:58
  • 签到天数: 1 天

    [LV.1]初来乍到

    9
    发表于 2004-5-2 13:42:00 | 只看该作者
    上面的发现有一点bug,0 x* v" ~, j; L* _
    这个改过了
    1 l. _) \- g9 c  y( a一个计算 24 点的小游戏
      E% i+ B  ?5 L) Y+ b1 b+ ]4 S% ]VB 编写
    0 a+ [* l; Z  [+ m5 `: N& ?7 s7 K; b

    0 B' Y" R# k3 ]% O! o# ~
    [此贴子已经被作者于2004-5-2 15:17:46编辑过]

    1 [1 Y! \8 C. k- b" L+ T8 t

    该用户从未签到

    10
    发表于 2004-5-2 14:41:00 | 只看该作者
    #include 0 E0 z& G& e: X l# p#include # F1 f# l: i" k" ]2 s' M& D / a. M7 E2 V* B( K4 c: Q2 cint EnumFormula(int min,int max,int num,int sum);8 ~- H% {/ n1 l( k1 b, G6 V void ShowFormula(int *Num,int *Sym,int count,int sum); 3 X6 n0 [% _" Z5 P3 V5 E/ M/ t* s3 Kdouble GetFormulaVal(int *Num,int *Sym,int count); , k+ D9 z# O% [% d: iint EnumArray(int *Num,int min,int max,int count);% E3 j' [2 I$ g; L, P: {0 E, E void InitArray(int *Num,int min,int max,int count); - A$ B+ d5 x" C/ L, o0 u4 l" hconst char cSym[5] = {0,'+','-','*','/'}; 6 |6 \. n/ L5 y; {. s3 V5 Y, g- q7 }! m int main(int argc, char *argv[])# t5 o' n e' j2 q { ! O7 n7 Q& |# Q* o/ N printf("总计%d个式子\n",EnumFormula(1,10,4,24));9 H! l( ~0 m, L6 L' A system("PAUSE"); * s$ B6 c$ _, \1 x+ H# H3 s5 S return 0; `2 e; G6 v( ?2 e# s K( }}/ z0 n* a; M' L6 k8 I [! Y. H* m/ h4 q: zint EnumFormula(int min,int max,int num,int sum) 5 [- u0 O- c9 s" f( C n) X7 f. U{, M& \$ \) h% h6 N% s- F int *FormulaNum = (int*)calloc(num,sizeof(int)); //储存操作数5 f2 j4 D' T' w& H5 L' T8 N //储存操作符号 0 t1 A, M% h/ A$ A //最后一位用于穷举结束标记 # _" U, p/ m7 t8 Q1 | // 1 - 4 代表 '+' '-' '*' '/' s( Q' F6 o5 x; h int *FormulaSym = (int*)calloc(num,sizeof(int));5 j2 E9 y7 B6 e 7 _- X# i7 n K! Q- E! Q; g( Z int result = 0; $ Q2 N4 o ^' h. G9 w // 初始化操作数和操作符号数组% J! d$ p" \* j + s+ E# m6 D: ]' T' Z int i; 5 }4 U4 Y8 c- K, u5 n0 x' P/ c* c for(i=0;i = min; 3 c: ]% s7 k& }1 B8 y for(i=0;i = 1; % J5 Y! h3 u% _. g7 c FormulaNum[0]--; " |) d" \6 X6 e- ~! P9 k3 b) ^0 f$ s3 V" u; V0 w InitArray(FormulaNum,min,max,num); 2 Y6 r$ a+ i6 \/ U FormulaNum[num-1]++; " h7 p% { {* S# `: n/ ]9 W // 穷举操作数和操作符号组合 4 \2 L: J' a! T: C0 K5 Y# ~9 o while(FormulaSym[num-1] == 1) 2 j2 [$ i; R- Z { - @! T$ v |9 d9 H* x double t = GetFormulaVal(FormulaNum,FormulaSym,num) - sum;6 ]% E% }! R0 E( V if(t>-0.01 && t<0.01)6 `) z' h: D1 c. x8 b7 l E& } { x7 U' \4 k( `* A3 y //printf("%d %d %d %d | %d %d %d ",FormulaNum[0],FormulaNum[1],* P# J# M1 Z" B' \' t2 S( L% ^ //FormulaNum[2],FormulaNum[3], . V' I9 @" N& b4 s7 F // FormulaSym[0],FormulaSym[1],& D3 z' W) q# Z. d% e$ U5 A // FormulaSym[2],FormulaSym[3]);; k4 b- K' o b* B$ V ShowFormula(FormulaNum,FormulaSym,num,sum);% y2 F, [5 A3 }+ t1 x& K0 c result++;9 I* v9 i. o2 |5 ` } ( Q @. w$ f1 v+ z : ^7 J) B8 g0 G0 r/ }/ [ // 依次穷举操作数 5 R' c$ D# _( W# e( V8 O- M ) d5 t$ L s8 v7 _8 }3 \8 B) Z4 @ //允许数字重复的穷举% @, \% T+ M `- a3 `4 z9 Z+ [ //FormulaNum[0]++; & N! o, `; } q+ ?3 x //for(i=0;FormulaNum > max && i8 m% |4 _( g% {) k3 {, i1 r* I //{" A/ e9 G/ q" K" i% W // FormulaNum = min; , _( A w0 T* J/ Q // FormulaNum[i+1]++; + K7 D# R6 ]1 _. o" N2 A //}4 F9 C7 n! `4 `5 ~( |6 i: E // 操作数穷举与操作符号穷举联接 / N5 ^. y4 {& O //if(FormulaNum[num-1] > max) 9 \: y' z6 e" J/ d) I9 h; ] //{6 ^9 k: F& K" @7 W( ^ // FormulaNum[num-1] = min; # b4 u5 a" l* M3 A // FormulaSym[0]++; 4 [3 B2 v- M0 W6 g- M //}* e2 r, M) K. t! M( e# b$ n3 k 8 m( K8 e% b8 m: Y/ f // 不允许数字重复的穷举: n' z n! t6 J/ x i3 r; [# W // 数字必须从小到大的排列,防止重复 3 W9 n+ `+ N7 | [' E# x( | if((max - min)< num) exit(0); // 出错9 R- m$ v) Y9 |9 W 3 d1 p, H0 Y* e3 ^ if(EnumArray(FormulaNum,min,max,num)) 6 D: F& o6 ?8 p. @3 |0 X! y( u" d' E1 G {1 f1 w* E2 d- p FormulaSym[0]++; u: P" } M7 J& M' e InitArray(FormulaNum,min,max,num); ! }! j; f1 N' F A, g, s( i FormulaNum[num-1]++;2 F1 p' }6 K$ }4 T( j$ p }9 b- C% s8 g3 j! W* R: t 8 F: T* a( G+ T& Z: {5 h // 操作符号穷举3 {, [$ m+ H$ @' w& _ for(i=0;FormulaSym > 4 && i" U/ W! x! G0 X- S% E {" N) G- Y0 F' Z1 r( Z" |8 J, q7 @ FormulaSym = 1;: @% c. l. u p: U FormulaSym[i+1]++;( M; a% a: p8 \% j, I* y' N1 E } 7 [; F' s! [2 Q5 j1 I: \$ k+ U7 ^+ x* T) q# t } 7 k' p% x) q7 @ //释放空间) S+ o, z1 W( d( [# c free(FormulaNum); 4 O& m+ m5 b/ J free(FormulaSym); 5 n7 z6 c v) T- B/ T: x7 u) | return result; . E. ]$ C$ w W. X0 n% t3 f} - S0 O6 a' k- G# d" R% x! H( g// 计算算式结果0 G E7 l/ \. l double GetFormulaVal(int *Num,int *Sym,int count) ! K* ~) F$ ~: O7 O+ K; ~# n9 T{ ; q8 V- N, }" M! g) }4 z' T int i,j; 9 E$ a9 V; B8 |) g# A double preresult; ! _- t9 k$ `% g2 P w4 P! o preresult = Num[0];& C# w" ~: s. |: Q( \ i=1;j=0; $ Z9 T7 O+ W5 H" X while(i( ?% J5 R7 S! P { , ^% h* x4 X1 D6 r, h switch(Sym[j]) $ B1 H9 D1 q, X, Z {5 h5 p( K2 F- q4 ^1 U8 l case 1: 4 i- L e, ?6 [# Q preresult += Num;$ ^" ]. r2 T1 p break;6 m% \4 U. m. e6 S$ N* `8 u case 2: 6 _- ~4 V. z1 d; j preresult -= Num; . p# t8 U; M, r# j: A4 \1 F7 f4 H& I break; ( O/ K+ o4 d! D$ ^/ [% Q case 3:2 F6 G- O. B2 k6 F5 S/ a1 i preresult *= Num;8 K3 K7 n/ P; g. ]+ W1 J break;, \3 e' Z3 N. R case 4: ! `$ |, m2 L- L- [, W4 {( Q if(Num == 0) return -1000;; x1 Q" d: Y7 A$ @ C7 P: g3 j' Z preresult /= Num;1 a4 h2 E) y1 `( V) e break; # s0 K$ | R7 y2 J) G2 | }! w! G6 y% ]$ ~; O i++;j++;' {. r4 g1 c* m& \% B }& {) G* }: o$ C& e7 r return preresult; //进行修正- _: y5 n$ j7 ]* a) G; b }9 ~, @" _: V8 a* G) D1 h // 打印算式( ]. X. M! g, e; z% b" N& J void ShowFormula(int *Num,int *Sym,int count,int sum)2 l6 F1 K* b$ M2 }1 |* t: z7 G {" j' |- ?; J; C: a& w 1 m s. Q- k( {+ x int i,j,len; + Z; o5 \' o1 @! @ \& m8 U char *Formula = (char*)calloc(count*4,sizeof(char)); 5 u$ ~3 ^$ G. M: u: J5 v char temp[10];. S2 v1 s4 ]( b* h! {7 G itoa(Num[0],Formula,10); * k! n. t. H5 `2 M i=1;j=0; `6 G& d6 C+ R& P while(i! e" A/ y% \: B4 ] { $ B0 e& Z. B" f' W1 Z0 d+ g( T itoa(Num,temp,10); 9 m5 t2 I2 H; v: n# j5 P, e len = strlen(Formula);3 n5 X2 [/ j! a& R6 U" f) Y switch(Sym[j])" P& U0 K1 `$ @ { 5 a9 ^# E5 I" s8 [$ O; `: t, V+ D% _ case 1: 9 i8 n$ x0 X% T3 `% P# [6 I6 } case 2: * H0 {* S% C( q8 ~, N( t% R Formula[len] = cSym[Sym[j]];! h c8 L3 \6 J! C8 @( S0 B strcat(Formula,temp);5 _. I0 w% D1 W4 n2 W break;1 \8 t- U' c2 B+ T7 L7 F% B8 |9 G case 3:) R5 {3 f3 O! u& L! K& w case 4:' k- }& R/ @1 l2 V, A, Y1 @ ! S, _% Q6 H. l3 G // 如果上一个操作符号优先级低于当前的,应加上括号2 K( l. }) _9 g9 Z8 H if(j==0 || Sym[j-1] > 2) ) X- F- H: F5 B& J* } {# J; e5 C5 _/ ^ Formula[len] = cSym[Sym[j]];$ \2 i7 _2 w+ B1 D9 T8 ` strcat(Formula,temp);5 a) f# i3 N7 m3 ] }7 Y3 g& B5 W- H else* w) m: V1 Z# M# [: {, m { ) q+ L1 K( c% f) Y int n;. A5 W8 c' T4 h5 a( C* O char *FormulaTemp = (char*)calloc(len+1,sizeof(char)); 5 y9 ~! l! H* t- v: D4 k; l, K3 j3 u for(n=0;n+ g' i. w* j0 U ]/ S { ' U W6 ^& U3 W$ ^ FormulaTemp[n] = Formula[n]; 0 {" K/ W" m0 \" \0 B6 C& T2 ] Formula[n] = 0; " [0 \. [. ~" h% Z! q* N } / r7 b- I/ v* p5 }0 U7 H, t% L Formula[0] = '(';' ~ q; N/ U @" k v3 @$ z strcat(Formula,FormulaTemp); ( @' R( u' ]8 A) M1 t @" ]) F P free(FormulaTemp); ) W) {4 a! W+ v Formula[len+1] =')'; 5 z6 _% F" Z4 o. Q" U Formula[len+2] = cSym[Sym[j]];8 J" b4 O" f+ a: ~ strcat(Formula,temp); ! E9 d# N% k3 ~" o2 \* } } S9 V9 _# C& c/ I, L+ S" i0 G break; ( }8 n) C z% J/ X- H) X+ q } 5 G6 x3 Z1 `4 Y i++;j++;+ c2 ~- f& R" k* J! w: [ } 7 F8 K+ X# L! j6 S% E2 s printf("%s",Formula);0 g2 O# O: ?+ Z2 |# a/ f' b printf("=%d\n",sum);; l& }3 M6 V5 q- F8 |; e! x/ b free(Formula);& Z5 h/ |4 n1 q }/ M6 z# q* y3 }! e. K2 c! E ; R5 a! A3 t5 x* C// 以当前数组为基础得到一个从小到大排列的数组 # x8 }; i4 W1 @) Y# x// 返回非0表示穷举结束 + `# g5 V; w6 B. vint EnumArray(int *Num,int min,int max,int count) 1 }6 g! ?# I* u' Q, C. T' n{- N# o' x7 Z) ]+ n9 g4 O int i,top; 1 Q& z7 P$ j# Z! X# z- L, P. ^: } top = count-1; 5 r( U. E# b: z( T$ a Num[top]++; 6 }/ ?/ ]! ?: Q% h while(Num[top]>max-count+top+1 && top>=0) H3 B2 c1 Y8 @: ]- i {: G I: a4 a! G' W/ |7 J top--;) N8 ^4 d! J$ z. E5 v Num[top]++;; p' h# d& l. Y) ?1 {7 M/ w }9 ^/ r9 b5 L, m) x1 n% ]+ v for(i=top+1;i% ~) A% P+ t1 [ b5 z/ R; U5 R7 ~ {. V+ E9 j8 ~# g$ H Num = Num[i-1]+1;4 `. i4 ^: A% ?1 J6 f } $ y" i4 L9 t# K if(Num[count-1] > max) return 1; ) K3 P+ q+ [' p" M& q$ P/ M0 C else return 0;/ Y$ u9 C5 n7 M* ?3 H# _: L } ! ^/ s: ?$ V P0 O 9 } _ {" X' q- J" Y# h( H// 不允许重复的初始化数组2 c4 X. Y1 g7 M void InitArray(int *Num,int min,int max,int count)1 W2 z3 B8 N; K- t& @) R f {6 C7 w( s9 {1 ~8 E& }: Y int i;: ?' w. A& u0 P1 s for(i=0;i=min+i; 3 h; m, _9 L1 L# x0 e/ u8 l. F Num[count-1]--; 8 P! ?3 o2 X2 _* D} P; T' D+ U, S3 V" W# d6 Y' Z( @ d9 l8 H9 S 7 B7 k# w6 ~& u2 w* w! _- C q ! z6 X7 J- I; B1 l' Z2 e2 L + U. o2 Q4 ~1 Z! C
    [此贴子已经被作者于2004-5-2 14:50:47编辑过]
    [6 ~2 a$ S* h0 k# a2 s. l

    该用户从未签到

    11
    发表于 2004-5-2 14:54:00 | 只看该作者
    本法穷举出所有用min - max之间的num个数组成算式,结果为sum的情况
    6 _# \0 s% ~9 U! r# B) S/ Q/ W) H3 L# N4 G
    如要具体的话,可以不穷举操作数,直接输入操作数,进行操作符号穷举
  • TA的每日心情
    奋斗
    2015-9-17 00:58
  • 签到天数: 1 天

    [LV.1]初来乍到

    12
    发表于 2004-5-2 15:17:00 | 只看该作者
    以下是引用游侠无极限在2004-5-2 14:41:26的发言:5 {9 w) Y0 W6 t #include + y8 f s) G4 u- C# K #include 6 M! x# }5 c( i c ) S& {# [# n, q! s. }" N' D# y int EnumFormula(int min,int max,int num,int sum); $ S. w0 x. B6 q. N, s# P void ShowFormula(int *Num,int *Sym,int count,int sum); % @/ Q# Z0 c1 t. c: T double GetFormulaVal(int *Num,int *Sym,int count);5 _. w3 j* y& p9 y1 ]+ r int EnumArray(int *Num,int min,int max,int count);1 q6 u0 ]- x7 b. P. f/ @+ N void InitArray(int *Num,int min,int max,int count);/ P; B& R* U. g# d% m/ e3 u: X$ ~' M const char cSym[5] = {0,'+','-','*','/'};. I2 Z9 q$ `4 a # t d* ]+ s8 }2 w9 N* i int main(int argc, char *argv[]) # I+ N, }( Q: N" Q* ~4 o { 0 ~: w8 p- M( q! g1 I* \6 e printf("总计%d个式子\n",EnumFormula(1,10,4,24)); : q1 o) U+ l3 O* c( r4 f system("AUSE"); & v; F+ ]9 _* e. Z! @ return 0; & X2 h) j! S C' T# R! S }/ C1 s, U- ?" o) T/ b 1 a! O2 }: Q4 B4 i2 c int EnumFormula(int min,int max,int num,int sum)( H/ h( V1 D( [ { & Q: v! @& A/ i int *FormulaNum = (int*)calloc(num,sizeof(int)); //储存操作数. ]4 B* ?, h0 X+ t //储存操作符号 ! C& F/ V) y+ ^& |0 Z% p //最后一位用于穷举结束标记 + K( @$ ~5 @5 x2 G9 S3 X // 1 - 4 代表 '+' '-' '*' '/'+ B& E" n$ S* m int *FormulaSym = (int*)calloc(num,sizeof(int));, ^' v' F x* V& z- `8 k G 9 L6 N5 x6 m- a& u0 I7 e& f int result = 0; + I1 c! Q1 R0 f+ w( N // 初始化操作数和操作符号数组5 a4 @0 E' ^4 l/ M! M6 ]: P2 K # y+ T( c; ] b int i;4 e3 q) t+ z2 {3 z; z7 m % _' Y2 w+ U, v/ _( E2 \ for(i=0;i = min; ' X& l1 @( m7 ~ for(i=0;i = 1;( c' z$ H( ^$ ]' U4 g* F FormulaNum[0]--;0 j. ]3 s! }) e h, ~. s # n! q9 z4 i v" o, P InitArray(FormulaNum,min,max,num);- B7 T/ S2 c4 h! d- F FormulaNum[num-1]++; 1 x' h1 E& z1 X; e1 s // 穷举操作数和操作符号组合" T9 I! r7 j% R7 P/ `5 [! W& ] while(FormulaSym[num-1] == 1). g, ]3 K0 N' H; g2 Q9 v+ M6 { { 1 b# {$ ? a; J) k/ @5 P' t double t = GetFormulaVal(FormulaNum,FormulaSym,num) - sum; 0 R! I: Q! I3 _+ i/ a if(t>-0.01 && t<0.01) - X* t. |8 d V { 5 u% A8 t! ^- g( J. u! e- W //printf("%d %d %d %d | %d %d %d ",FormulaNum[0],FormulaNum[1], " } g/ A% \* X //FormulaNum[2],FormulaNum[3], & P R$ `7 L! Q1 k- K9 X% m( B9 o // FormulaSym[0],FormulaSym[1], 0 N! E w4 l- I3 `7 {9 {; s // FormulaSym[2],FormulaSym[3]); " a" C6 l( X! A* R/ q) j ShowFormula(FormulaNum,FormulaSym,num,sum); . m$ x0 _2 Y( e3 `$ p, a$ `! C$ C result++;0 Y1 ]# {. y5 U( {8 i2 C0 Q/ w }, f/ y' p5 _/ K * L) L& S8 T' `5 |3 U1 |5 o // 依次穷举操作数 6 D) b" A3 K; G) } 3 B. G4 s$ c8 p; ]) ^ //允许数字重复的穷举5 f! P6 ?! Y3 o& V3 ~. P //FormulaNum[0]++;) R8 K- v }" t) |5 n //for(i=0;FormulaNum > max && i k' m+ e; L. U0 F8 \) E //{8 r# q. }2 u. S2 y( i1 d // FormulaNum = min; / X8 }8 c, I& u& v // FormulaNum[i+1]++;0 A; `1 M# o7 M' W! k //} 9 n% G$ |9 B$ N; W5 z // 操作数穷举与操作符号穷举联接 + S( ^. y2 f h/ R //if(FormulaNum[num-1] > max)+ a8 B1 H% E. q0 q6 \ //{ 6 |; q Z a( f' Y // FormulaNum[num-1] = min;0 l8 B) i( Y8 t0 i4 c; B5 \3 Z // FormulaSym[0]++; * t! N7 v0 d, i //}# O" p5 ^' d1 V h" U8 E 2 C4 D- ?! K6 ~) I6 e6 U" n& s // 不允许数字重复的穷举 ; B$ k$ {! N3 u9 R2 E8 O5 X D // 数字必须从小到大的排列,防止重复 ) ~$ J- D' G1 K' ?/ [! r if((max - min)< num) exit(0); // 出错9 x! h) e1 u+ E \" E 8 |, g! p1 I9 K if(EnumArray(FormulaNum,min,max,num)) ( R2 S: u4 F2 Q( X8 T {' R7 S! f- a0 A$ w2 ?9 X FormulaSym[0]++; u1 A1 j8 l) X7 v. ^ InitArray(FormulaNum,min,max,num);5 G) I, S% U* l FormulaNum[num-1]++;& U9 [& C% D4 c }: }0 z2 @ l$ ]9 A! j u6 b! d - G- ]% [( ?" p: }8 S2 c4 a# ] // 操作符号穷举' ]! J& O7 j. w1 N, y' P# I for(i=0;FormulaSym > 4 && i$ ^, g1 d5 j; z) o0 t7 p, u% c {. M5 u5 D0 ?3 F) i: b, k FormulaSym = 1; * t* X! _, x6 j5 X% F FormulaSym[i+1]++; $ F. A7 K# N6 I9 m' M; a; d. R }7 M# n3 Q! g* N( M5 G! U & n* D0 F$ e2 A8 @) `' Y9 G X } + W" `: @) @% c/ L //释放空间 & `6 i0 O* X% R3 n5 R) C/ S free(FormulaNum); . K: P2 e1 J' f- J, A free(FormulaSym); $ L0 O' c+ ~3 W- X8 Z return result;5 a1 I8 l" P) l8 Y- I+ }+ [" V } 3 T7 g" t4 ~- W) w6 H. Q! W% Y& c // 计算算式结果 5 G, A' X) i' d1 ?3 [) x! p3 i+ Z double GetFormulaVal(int *Num,int *Sym,int count) $ u1 N. p0 \. W, j { ' K7 P/ m- O2 C( _8 R int i,j; 7 F9 D9 G% R+ P* O M; { double preresult;) j b4 K2 \; t+ U, |5 _ preresult = Num[0]; $ @) i$ `( N: v/ I i=1;j=0; o$ T: ^7 m; o' q l while(i s, [1 K; m0 Q& s; F, ` { M, Z8 N5 X, ? switch(Sym[j])% N, @: j/ J+ z/ Z, c1 i# ^- | {! s1 t# q; _ M7 t9 a5 G) Z case 1: ; x. Q! R. U/ p; z preresult += Num;4 K" W$ U$ V9 z* x+ o. a break; 4 T+ w/ x1 \- M* M+ u& _- \0 w case 2: ) X# ]! p3 t! ]& \ preresult -= Num;9 q4 S: g5 p- A7 Y5 c L break;! \; N* o* X V# o t2 |$ p! w }/ C case 3: 3 f/ K' ^( G/ K; ]5 w preresult *= Num; 5 a# ^8 K. I0 v! G( c break;4 T2 y' A% ]! g# i4 S+ }$ ~) v case 4: " L+ o) F0 l* _ if(Num == 0) return -1000; ! ~, K6 z a6 m% K9 \1 C preresult /= Num; : E0 _2 y2 w* i% D; J break; - M( Q' x3 j8 K" d2 Y, z } : _, G* b5 t" f! |9 j- O i++;j++;0 p& ~+ N3 Z% v- c& h' d: |8 v } # B2 J& t3 A; x# h0 e return preresult; //进行修正1 G( P5 e1 T4 E, [5 |4 c } 1 E- e1 E: A: @# C- o; C# J2 T // 打印算式 ! U7 R5 U& ]- m* E- R+ G# |4 y- C void ShowFormula(int *Num,int *Sym,int count,int sum) 9 @$ `0 P+ L8 E+ \9 j: k. V { 6 p& \: A# h! s& g% b5 G' D0 P, v2 m3 Z. L& d' G int i,j,len;3 g8 V; J$ S _' P' f B* X char *Formula = (char*)calloc(count*4,sizeof(char)); # b3 a: g4 k, z8 v! Q/ T5 R# f) }! @ char temp[10]; # m7 z$ l% q: o8 K. R1 P; f2 J3 N itoa(Num[0],Formula,10);$ Q3 b/ J- q7 Z3 N# F i=1;j=0;. [, b9 A6 H& C5 R( q( c while(i% ~8 Y3 g$ Y, O; Y! k& [( m' M3 } {2 a8 e3 S' j& d$ |& z itoa(Num,temp,10);. x* K1 P8 {" r+ d# T M; P; ^ len = strlen(Formula);. o0 n& g Q8 W- E switch(Sym[j])2 M% Q& _' l/ x$ e; j { : o$ d* S! v ` case 1: ' c& _) x/ x% v) W, I( j# ^3 |) `1 Y case 2: , `: H: x% h, x9 {- O0 _5 x { Formula[len] = cSym[Sym[j]]; , f+ ?, P( C; H strcat(Formula,temp); & ]6 q6 p! p! @- | break;, n- h* z3 h; ^- T ]8 B- I case 3: * Y& D% Q/ _1 T case 4:1 T3 E2 X8 |# i! O6 N' `1 i7 y % w8 T% L4 X; V N/ c* T1 M+ ^ // 如果上一个操作符号优先级低于当前的,应加上括号/ g2 o; {* F6 R if(j==0 || Sym[j-1] > 2) * v6 q" M! b6 Y0 T {! }. w- {" R! T- f& W$ P Formula[len] = cSym[Sym[j]]; " v% o& \9 j( W* D& N/ G( Q strcat(Formula,temp);9 {. L' t: c, Z# |4 E } . K. w! I$ B/ J/ ], G else% ]% E2 x6 ^5 \. E% l: n- @; A9 R { % v- \3 ~& S+ f- l7 `0 y- [( ? int n;" o, R: D/ P( F$ Q& Q; ?) m" p1 l' A char *FormulaTemp = (char*)calloc(len+1,sizeof(char)); 0 \# Y# K7 M7 p5 B# M. M% E for(n=0;n- i! O2 b4 v$ n- S4 z { 8 n0 \- B' Z6 v% D0 c: H7 P. [% k FormulaTemp[n] = Formula[n]; 0 u% J# M* k f) {3 h0 i Formula[n] = 0;9 d U. L9 D* h& e2 Q } : s q) O |. u8 H, k1 b: H Formula[0] = '(';2 c! N1 d& _+ y. K4 }- n3 v strcat(Formula,FormulaTemp);+ i- a9 O# h1 s# y! V3 l free(FormulaTemp);4 S' f% f7 ~3 A& z% { Formula[len+1] =')';1 Q9 s, k$ X1 d' t9 J Formula[len+2] = cSym[Sym[j]]; d. P1 P7 M2 \0 B1 k) t5 u$ ]% R5 ] strcat(Formula,temp);" s, f1 o V% T } % p6 c, b+ g* c break; H1 C9 A/ w& L: B$ ~- C1 a } 2 l& l$ L+ w3 s6 ` i++;j++;. P) M1 R& `% [" N1 R: F% W0 V; i } 0 y; j. |* }7 j4 p9 \* l printf("%s",Formula); ( k: n' j C: m C7 u$ Y. V printf("=%d\n",sum); ; i* U; n Z o. ^ free(Formula);' Y% y$ r" z5 }" | } % ~1 g; R1 I; E0 M. Y" t5 | ! I) f f% }8 ^3 Y W! C+ H- m // 以当前数组为基础得到一个从小到大排列的数组 6 M4 t+ V- i- G; q2 ^0 H3 n // 返回非0表示穷举结束 " q8 D, y* {$ U$ e5 L int EnumArray(int *Num,int min,int max,int count)6 Z6 J. Q) ^! v { Q: m5 X) |" v) n; k; ? int i,top; , T' `3 ^, f% r! y top = count-1; 5 I1 ]) _- X; \3 j Num[top]++; % Q# N. [1 V! K# ]5 [, n while(Num[top]>max-count+top+1 && top>=0)9 U. U- X/ r# l6 n( D8 E* j: q {+ D6 t! ~" ~1 S7 k: j7 O top--;1 q& a2 n( ]7 b/ p; V6 t+ d# c Num[top]++; . g( J7 P9 F, y1 j4 C3 C# q }2 W% n% f& n' _' g% g' { for(i=top+1;i" A; _9 @! T5 x( z/ U: q3 D4 n {3 h3 `" l9 s3 n- m2 E& s- d Num = Num[i-1]+1; ; A8 ^+ S1 `. r* ?" B- s }! b O! M4 u3 R if(Num[count-1] > max) return 1;* W$ t5 i: d1 z4 b2 l h else return 0;' R7 K6 \# Z% A; Q" o( X- F5 u }( D% v! C& h$ j3 O3 { 3 p* k# J0 v1 Z) G3 X: v // 不允许重复的初始化数组; i d8 E" ?2 m- Y! P& c* I void InitArray(int *Num,int min,int max,int count)" K% G: E. M4 h* W' Z {8 y: r( }+ G A; w3 [2 J# c int i; , S5 V' A6 b) u: C0 w for(i=0;i=min+i; % I5 |2 u7 c0 h* I0 G: h2 r Num[count-1]--;$ ?- q0 S: z, ^3 f$ _ }! Y" M5 G. W, @6 ^7 D 4 B+ T, G- i) d! l) k. h- E ( V U9 U/ s5 }+ S2 b' z. u# |( N4 |/ m* G6 J & w( `3 t& q% ?' `( N: E
    [此贴子已经被作者于2004-5-2 14:50:47编辑过]
    5 ]5 m! ~( ^& U$ r/ w3 n % j9 ?0 V) C$ |: f. E6 L, v( [printf("总计%d个式子\n",EnumFormula(1,10,4,24)); 的运行结果是: . Q" W. Q* ^, j2 U& P8 g+ Q) r# W1+4+9+10=24; U) `4 ]& U9 M6 s# ?: s 1+5+8+10=24 9 J0 X, s9 k$ M' _1+6+7+10=24& i& j; Q( [9 ?5 o* d5 n 1+6+8+9=24% z s& w7 n! l3 w5 K 2+3+9+10=24 # L8 b8 w- Q# f: @2+4+8+10=247 X) W( g9 {& Z 2+5+7+10=24 " A. p/ v& d# v& a J5 o) g- D2+5+8+9=24# ~4 q+ F5 ~. S" t6 o: J# } 2+6+7+9=24 % |( M c# K- C3+4+7+10=24 - a% K# L2 M, z3+4+8+9=24 ) k6 ]6 ]0 |5 S5 c3+5+6+10=24 - P6 u1 ^5 M0 Q8 E$ j3+5+7+9=24$ r( n& T9 R! ? 3+6+7+8=24 9 O3 D3 s2 R9 e* K* O1 I7 _0 d4+5+6+9=249 W9 _) T7 W& U% m 4+5+7+8=24 & \ X- ]) W9 \9 n! n q+ M8 k6 l这是什么意思?似乎是找出了 1 至 10 之间的和是24 的数据,这和完成计算24点,差很多吧? , l6 Z- S" A$ E! j比如用户输入 2 ,5,7,8 程序应该能得到计算这四个数据得到24的表达式才行啊,这样就可以写一个游戏了。 8 c7 l, I: @9 F8 G如: 1,5,7,8 有如下方法可以算出 24 1 N" B& V/ Q2 {# g1 e1 L4 Q((1+7)-5)*8 = 247 D e$ s4 J1 `4 |: c+ h ((7+1)-5)*8 = 24 & Y4 i8 T9 P1 y(1+7)*(8-5) = 24* @; `8 L. n8 b1 Y (7+1)*(8-5) = 24 * \% [8 q: ]* E( K2 T: F((1-5)+7)*8 = 24: l9 Y' {# K# c% p ((7-5)+1)*8 = 249 B. c, u, W# F" \! q# L (8-5)*(1+7) = 24 6 O5 D h }/ ~(8-5)*(7+1) = 241 @# C' I' p# O4 i 8*(1+7-5) = 24 h' [# a" N9 k8*((1+7)-5) = 24 M# V! k/ `4 T* H; W9 f5 [+ H8*(1+(7-5)) = 24 # c0 G+ Y6 \, Z8 s6 d$ ?: `. f8*(7+1-5) = 24. v, B/ Z& W- A) A 8*((7+1)-5) = 24- q5 z/ g' w% p; a9 n+ e) z0 _6 q, V 8*(7+(1-5)) = 241 }7 `% [. |- `. d+ l4 r+ [ 8*(1-5+7) = 24, M& q; V4 N: A& }, | 8*((1-5)+7) = 24 : `6 R l. u+ b5 U8*(7-5+1) = 24 ; ~% D# Y9 P/ N8*((7-5)+1) = 24% f9 R7 y9 d5 `2 e+ I9 { j

    该用户从未签到

    13
    发表于 2004-5-2 15:21:00 | 只看该作者
    结果是这样的:: E" ?( ?8 [4 X# j8 U, x) k
    1+4+9+10=24
    6 j: t: p6 e' A# w) B$ `- I1+5+8+10=244 ^' t( r/ f+ ^3 H" Q5 u
    1+6+7+10=24* @1 g2 r# k1 v  l
    1+6+8+9=24+ i3 E, U, M# U6 S0 [6 y! W) k
    2+3+9+10=24
    , u0 w: H5 G& c8 S9 k1 C' y2+4+8+10=24
    ( S* \! l- Y  b( M2+5+7+10=241 a. A. |( O# }+ w; x" O9 ]
    2+5+8+9=24
    ! j2 z; d1 B6 @& J2+6+7+9=24
    : p# N  @' v+ t7 v$ I! \$ J* E3+4+7+10=24
    % x. H! p' Y! n* @3+4+8+9=247 t- G% ~( X0 @  x* o
    3+5+6+10=24
    , s7 l! d6 b( m( a' H1 a. M3+5+7+9=24
    , x7 a* e# a" j& }: g5 X- p3+6+7+8=24
    8 m# F$ B, m5 _) K. A4+5+6+9=24  _$ I. o: \5 R- P! U7 N4 }1 |
    4+5+7+8=24/ v/ V4 Z$ T1 F) X$ S# t7 e: b
    1*5+9+10=24) ?3 r+ L% m4 x, x
    1*6+8+10=24* k- s, D' \0 p/ l
    1*7+8+9=249 p! n' w. O- }5 i9 _) \
    2*3+8+10=24/ X; f' M9 G9 p# Z
    2*4+6+10=24" v3 T# l7 ?3 x4 a0 }
    2*4+7+9=24
    2 ~$ k+ N# Z& T$ A. S+ L% F2*5+6+8=24
    ; ]' ?7 ~- h) u8 T3*4+5+7=24
    5 @  j! G( d9 K* Y2 i4*5-6+10=24; _' R$ z6 i9 q- B8 \
    (1+2)*5+9=24! \$ W5 M; N8 t! y8 K) v
    (1+3)*4+8=24
    7 O7 I, T1 U2 G2 i! U1*2*7+10=24
    . k6 x' T7 J+ e. y. I+ k% _1*3*5+9=24
    - |2 I' o$ g5 W, R# Q6*7-8-10=24# \& F$ j& x* K& Q& `- }& A
    (2+4)*5-6=24
      D5 f7 m  ?) L1 q, d! M/ S3 q6 y* P2*3*5-6=24
    1 i4 A# {1 F5 V(1+2+3)*4=24
    0 M3 |4 f& N9 B* ~$ I% P(1-2+4)*8=242 h$ Q' q9 ^2 a7 J, m$ N, Q4 B
    (1-2+5)*6=24
    & s. t/ y! o9 {% Z(1-3+5)*8=24
    & ~7 u0 z3 r9 X8 M(1-4+6)*8=24
    2 b$ _3 B0 k) ?( ~  P; R7 i& W(1-5+7)*8=24% k: U& W1 E) l- }! q8 @( g: v% I/ ?  T8 ~
    (2-3+4)*8=24$ J, b3 `% j" Y5 W. o
    (2-3+5)*6=24+ d1 O9 Q; r) ^) L
    (2-4+5)*8=244 D& ^: N- Y6 i+ g
    (2-5+6)*8=24
    ; G. c4 B( P, N- Q(2-6+7)*8=24  V- v, u* v9 V6 A) o9 l
    (3-4+5)*6=24
    7 b4 F! P1 p) ^' n8 ^(4+5-6)*8=24
    ! a! x" J- h2 K3 m(4+6-7)*8=24% d, o6 A, n* F6 m8 v, u
    (2*4-5)*8=246 o2 E  j- ~* ?; G3 u7 z; n
    (2*5-7)*8=24; Q+ s6 l. n; u9 |  B5 U
    1*2*3*4=24
    ! b3 d$ X, O5 }  e, p' ^& V/ l1/2*6*8=240 c8 e, ^# W7 C) ^* z5 p
    1/3*8*9=24
    ' W- h; c6 j; D2 N6 L2/3*4*9=247 \9 ]) \" R& {7 d
    2/4*6*8=240 G0 Q- I- G0 E7 W
    2/5*6*10=24. S5 M! Q7 N2 P& L& I
    2/6*8*9=24
    - y: ?6 |, q. d1 ~5 o) ?( d, A3*4/5*10=24
    7 b& i0 ?7 w% e' I5 Q, W5*6*8/10=24
    2 a- t# c$ f0 }6 f' t8 A2 [; n总计57个式子

    该用户从未签到

    14
    发表于 2004-5-2 15:22:00 | 只看该作者
    当然不会只考虑加法的情况,大概你复制的时候出现问题了,你可以下载这页最上面的那个程序
    " x( h7 @% ?  S! ~! Y/ }
  • TA的每日心情
    奋斗
    2015-9-17 00:58
  • 签到天数: 1 天

    [LV.1]初来乍到

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

    [LV.1]初来乍到

    16
    发表于 2004-5-2 15:28:00 | 只看该作者
    (2-1)*3*8 这个算式你就没有啊,这4个数字的组合都没有出现
    2 Q  A  B% e# ?( X, Q7 a- x4 \; c4 t  V
    ) Z" n- g8 x3 V& u% I

    # Y& a* d% {, I5 h- r) v6 ~' A* s' F* @
    % J& C3 y9 o# m6 S

    + Y% _" `) Q: M' y% j( z
    [此贴子已经被作者于2004-5-2 15:32:12编辑过]
    . @+ c5 [* {! l5 l5 i. t
  • 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 | 只看该作者
    ' s6 J  d0 `8 a0 R; O/ I3 o

    ' D4 L& p* m2 k" X% R" g7 G用这个好了,只不过输入的时候要按从小到大9 |! p3 h( m* Q8 }" |; q/ T
    " i* ~3 N  R6 R+ C3 U/ i3 Z; I
    好象有BUG,我暂时不太清楚

    该用户从未签到

    20
    发表于 2004-5-2 15:38:00 | 只看该作者
    以下是引用yzhlinux在2004-5-2 15:28:15的发言:( e% q; N$ S+ {$ h
    (2-1)*3*8 这个算式你就没有啊,这4个数字的组合都没有出现

    ( n* Z; s% f6 I/ k
    5 u& W& f1 i0 H  a本来为了防止诸如
    & k% }9 f$ {% O4 z1*2*3*4' ]  k' ^3 p) r! x
    1*3*4*2! _( R! {2 [- o3 q8 g1 v
    2*3*4*1$ L8 D! L9 E/ Z" B/ y
    等的重复,只使用了从小到大的数组,不过这样好象也丢了不少可行的式子$ ]0 o' k& P& a, I

    0 p/ F4 i4 h6 b3 I" h另外你的程序就是有这些重复的' t$ ~. u3 P+ _1 a3 u4 f( l. B
    8 U9 Y- D7 B  a8 w# d3 p: Z
    PS:VB的程序感觉就是慢好多啊
    0 q, X* Z3 J! ]0 ?
    [此贴子已经被作者于2004-5-2 15:42:01编辑过]

    9 B- D. h, K( P/ k% H! x) F6 [

    本版积分规则

    关闭

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

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