下沙论坛

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

QQ登录

QQ登录

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

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

[复制链接]

该用户从未签到

跳转到指定楼层
1
发表于 2004-4-27 17:53:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
就是扑克里的24点游戏,4个数,+-*/得24……
: l- m$ L9 y8 C! b# }7 _: Z
* s* t. Q" g3 G  g5 D3 C: `% Y偶还在想……
分享到:  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的发言:1 O4 @& B8 t; A. s# g% Y
    穷举法吧
    8 U' [' C8 \* w  o9 ~
    那你的代码要写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 则表达试就是我们要求的了。比如:
    * Y3 y" d8 A6 H3 L. Sfunction GetMach(A,B,C,D) as String       '得到一个字符串组合如:(A+B*D)-C
    : Y0 d- c. g& mfunction GetValue(MachString) as Float    '得到字符串的计算值 ,可能是小数; u; J! @% h5 O6 z+ w0 r9 Y
    那么程序就好写了:
    9 P; I/ t1 T' v9 }; n3 AGetNumber(&A,&B,&C,&D) ;    '得到ABCD则四个数字,赋给A,B,C,D四个变量+ X& D8 G/ h1 s" V" \  }
    do{0 ~* C$ [0 ?' R! \( G
      MachString = GetMach(A,B,C,D); '得到一个表达试的字符传5 G* O4 J1 Y% g2 T, z: u6 \
      if(GetValue(MachString)==24) break;  }, w% {6 U5 b9 {# w6 n7 b
    }, Z1 X6 G9 p& Y8 Z( h
    print XXXXXX;
      \  b) b+ m: E) n3 ^) L5 f8 h

    该用户从未签到

    7
    发表于 2004-5-2 11:57:00 | 只看该作者
    我现在试着在写,就是不知道有什么好办法解决重复的算式问题,比如
    9 l( A# @2 Q; a0 K/ H- N(5-2)*8*1
    ; ~1 d9 d( r5 G1 X# H$ S/ a% P$ J' i
    (5-2)*1*8
    + M& u' B& S6 l/ Z4 x1 I3 c0 ?8*(5-2)*1
    7 F9 E2 o, y& i等等
  • TA的每日心情
    奋斗
    2015-9-17 00:58
  • 签到天数: 1 天

    [LV.1]初来乍到

    8
    发表于 2004-5-2 13:17:00 | 只看该作者
      I. b- c+ @; L

    " _, d$ d# G/ h0 O/ z& p1 V. h花了一个上午,终于完成了
    2 V0 A% [- J# b# p% k你参考参考吧,哈哈
    ( V" h4 i' M9 [5 z! w6 Y5 [  m/ r6 x/ T9 X; Z+ d0 E
    2 g" Y& ?. n" w, a0 ~
    [此贴子已经被作者于2004-5-2 13:43:13编辑过]
    3 A) F/ l/ I+ M7 r# n! ?! J
  • TA的每日心情
    奋斗
    2015-9-17 00:58
  • 签到天数: 1 天

    [LV.1]初来乍到

    9
    发表于 2004-5-2 13:42:00 | 只看该作者
    上面的发现有一点bug,% g, ]. c. S- T6 d
    这个改过了
    8 k& Y7 B; g9 X; c3 J% K一个计算 24 点的小游戏
    0 \1 L; V: N: Z$ p2 KVB 编写( Y% A5 e; l% G& W0 d1 m$ m( X
    - A& l8 P$ q; U" i' |' K3 z

    1 S6 k0 Y' n) M  H$ h2 b6 q( X
    [此贴子已经被作者于2004-5-2 15:17:46编辑过]
    , {" j- i8 I$ T5 ^

    该用户从未签到

    10
    发表于 2004-5-2 14:41:00 | 只看该作者
    #include ! W" d9 B( f* O# s3 _ #include 7 w4 ?3 [ P1 }' ^0 u% s Q- t& y* I' ?0 `' H9 ^& D int EnumFormula(int min,int max,int num,int sum);# n0 T, B- O" v1 Y/ u! L void ShowFormula(int *Num,int *Sym,int count,int sum);! X5 b' L1 u7 h+ u& R+ E double GetFormulaVal(int *Num,int *Sym,int count); / }7 o3 E; w3 @* Lint EnumArray(int *Num,int min,int max,int count); ( ?2 Q/ d( g X" @void InitArray(int *Num,int min,int max,int count); % B% G5 U# h1 j5 R2 Tconst char cSym[5] = {0,'+','-','*','/'};, `1 _1 w& T) W+ _2 y / y; _- _) J5 ?' o: bint main(int argc, char *argv[])) X9 `7 `: C6 s% P w {5 P& d5 A: q# F% y$ l$ O printf("总计%d个式子\n",EnumFormula(1,10,4,24));7 \7 K* M( ?5 C- W; }% O system("PAUSE"); . F* z" d+ P! y( D+ N return 0;! \. j, S6 Q" N7 _' j( ?1 H } 2 b% h$ n; {; V ; ]1 S: N5 D/ Rint EnumFormula(int min,int max,int num,int sum) / t V3 E* i3 d{ 9 e/ p* C6 H) C int *FormulaNum = (int*)calloc(num,sizeof(int)); //储存操作数; X& c6 w9 o, Y //储存操作符号 , G0 ^/ G, w2 _& {" L& F //最后一位用于穷举结束标记0 S# a7 ?) A) E. o- w2 F$ V0 r // 1 - 4 代表 '+' '-' '*' '/'* F1 D7 ~; l# \7 W# a7 p int *FormulaSym = (int*)calloc(num,sizeof(int)); . Y, V! l. H0 q8 J9 X ! O( S9 R2 I) A0 K int result = 0;( {6 f4 E$ T) ~* w, C // 初始化操作数和操作符号数组 / D- c: p4 b( y6 A. M4 D # ~( E" s2 q# g int i; $ M. i* L) ?7 Y' v1 s- { + X4 F/ t N1 Y1 Z" X for(i=0;i = min;/ e7 x' T% O3 z4 I for(i=0;i = 1;8 E9 ~" p& |8 v" j FormulaNum[0]--; : i' G) V5 f7 v3 J U# n$ \7 H, F% {, Y) s InitArray(FormulaNum,min,max,num);( o) T% ?" W3 s) N. o/ L FormulaNum[num-1]++; ! u' V- h4 e# U4 J- t# n // 穷举操作数和操作符号组合 9 U# ^6 r% c% ^) x% z7 ^ while(FormulaSym[num-1] == 1) 6 S! W2 f: d6 H5 m: q" Y- ` { ( F2 w" e0 C5 W4 k* A double t = GetFormulaVal(FormulaNum,FormulaSym,num) - sum;0 T$ b7 s. r- x/ K if(t>-0.01 && t<0.01) 7 E# S( S& W' U* R9 g { 3 M# b! ~, |0 h8 b, E( R8 N //printf("%d %d %d %d | %d %d %d ",FormulaNum[0],FormulaNum[1],5 I1 j( V: u$ ]6 x% p8 v, C, k- Y //FormulaNum[2],FormulaNum[3], 0 Z$ E7 E1 I5 P8 @* \ // FormulaSym[0],FormulaSym[1],# r% N* E& c2 l- W+ x // FormulaSym[2],FormulaSym[3]); ' [$ `+ y e) } ShowFormula(FormulaNum,FormulaSym,num,sum);2 B. W% \8 C% |' ^ Y: e result++; 9 w6 u4 P, d S3 S& W } 5 C* E/ \3 T% a # D3 U* h0 \4 }2 `$ P // 依次穷举操作数 3 I$ U8 g. V3 [4 c' n2 a3 n & S5 u1 x& r; j: A% o8 ]3 s8 A8 a6 R8 _ //允许数字重复的穷举 Z1 }9 ~3 c% G o( O //FormulaNum[0]++;. Z+ x; a1 X2 T //for(i=0;FormulaNum > max && i# c c$ m& A( M //{ ( X7 z3 H/ F/ q% P: a4 q4 g- k y // FormulaNum = min; " {0 _0 X. r" ~0 Q' | // FormulaNum[i+1]++;& X5 c& A3 F8 f //}4 E ^$ w: L: @5 `- ^, e. s // 操作数穷举与操作符号穷举联接 8 w: U5 i8 T( F1 h* V: M# y //if(FormulaNum[num-1] > max) 5 g- _- S D( C7 E1 z* T& M //{ " P6 G' w" y6 |8 L; \; p7 ] // FormulaNum[num-1] = min; - C9 C9 Q3 v& W // FormulaSym[0]++;. J: Z: w" s8 a# W7 F2 j3 F //} : T3 _3 d }# m3 U; @; J- J2 }+ t5 a5 n1 A$ S% Z // 不允许数字重复的穷举 $ _: M( u v! S+ _9 r // 数字必须从小到大的排列,防止重复 6 ?6 `& ^. R& P1 k if((max - min)< num) exit(0); // 出错 ! e% @" Y" j/ r& G0 r0 A1 h$ ^ % ^6 {& s" J$ g3 j if(EnumArray(FormulaNum,min,max,num)) : b2 _* X4 Y3 z; f { 6 R6 [9 Q- T8 A6 r+ i0 L5 p" f) t- z; r FormulaSym[0]++;$ p( q6 s( Z2 f+ j/ @( H4 d7 w$ d InitArray(FormulaNum,min,max,num);6 p i7 H2 }6 W- ^% H. Q* ^& N" s FormulaNum[num-1]++;" i8 P# }5 O* D- a } 4 G: s/ e S' [# u 1 O; z& b7 @$ k4 @: u // 操作符号穷举 0 ?) a u6 @6 T; }& F" W for(i=0;FormulaSym > 4 && i: E1 P/ q' j, s { . I4 V* h" p" \8 s FormulaSym = 1; . M/ r9 i9 v+ X" t$ Z$ K. k* s$ O FormulaSym[i+1]++;+ y7 \. U( G3 n$ u- a& B# R } 4 m& o5 n( `! [, N* d7 x: _$ q- n! `" k% C" `+ q } . X" g# l4 _( M- V1 f //释放空间 . P$ v( |( C" q1 R* _ free(FormulaNum);4 i) `, u7 _$ p" _+ V free(FormulaSym);/ H0 D8 F% r! ^( _: I- g return result; - }" P3 Z0 g% x% v4 Y}7 V0 Z" k& r$ o' [3 r& g // 计算算式结果) R; H( ^3 l& e/ J& g+ J u$ c1 ] double GetFormulaVal(int *Num,int *Sym,int count)4 p. Y1 k1 ?0 ~4 I2 ^! ] { 0 e% K1 S2 |( p: f e% ^$ u int i,j;: b% u: f. p6 h6 v1 X3 G9 Q double preresult; 7 E- o& P% |6 L C% E! P preresult = Num[0]; 7 @1 j% J- k2 a8 {+ G: e5 Q! b i=1;j=0; ' a* v2 a4 {- C while(i7 k5 O, s: F# j3 L; G { % l) M' S- P" C% {7 D3 b e switch(Sym[j])3 @ V/ Z6 T! \' g/ M { " Y2 ~' Z0 Z& Y case 1:; u# U4 g. ^0 {% G6 g! P% f* H preresult += Num;/ |7 y8 v3 d* h+ t( M$ L break; & X6 A/ v& Y; P' n% F: B) w& g. i case 2: 1 u2 d# c# u9 F preresult -= Num; 2 I* s$ ]" X$ q% d break; 4 K1 e4 D3 I, @7 i) G case 3:. Q) r5 t) k( n0 Q5 d4 H) G preresult *= Num; $ R( W6 e r& |% E break; j. n+ D/ l4 k+ W case 4: / v) E, V0 B- {% R' U8 i- R: W7 h if(Num == 0) return -1000;- B/ B) e7 o; d preresult /= Num; 8 g5 S* [% t. S$ Q break;# F8 R& M' I0 d1 q }1 B7 z$ u5 i4 H/ `- ?1 l, @; d! [ i++;j++; 2 r3 D0 Y0 I' i4 z } ' ~6 o1 ~4 R" C, y g; [0 w$ ?; S return preresult; //进行修正 # m w3 I; d* e+ o}/ u/ b) B; o: ^4 N // 打印算式2 E) Y! g/ f$ M. r void ShowFormula(int *Num,int *Sym,int count,int sum) 2 C6 `) ~! a( g- d3 q{ 5 [3 J0 U6 `6 R # M2 H7 ^/ @" M4 ~/ Z1 ]4 [/ u3 | int i,j,len;6 F2 W8 ?5 V* F. t- V- E3 h# i& @, H char *Formula = (char*)calloc(count*4,sizeof(char));! I5 N! w1 u& L/ t0 c2 c! { char temp[10];. q/ B' J: C: b itoa(Num[0],Formula,10);' {! J+ c4 c: ?# S5 U: A5 i i=1;j=0;/ z2 L! Y2 A( Q, f% v while(i0 T( f9 P1 \; Q" ?( A {$ F8 Y6 o6 H0 _4 p, U itoa(Num,temp,10); 5 b$ S. O) o9 V/ [( R! w len = strlen(Formula);5 \: B+ L' \: q3 A switch(Sym[j])$ ]' L8 M& G! s# o5 t0 D; e' F { o# D9 B% g9 u' ^ case 1: 4 a6 s! I8 a* }# \0 F* E+ M case 2:7 x: E! W8 a" M& _8 M8 j3 d) c Formula[len] = cSym[Sym[j]];' @% o) m r/ ?" M' ~ strcat(Formula,temp);. s% F4 U7 L, T6 q0 E break; 3 O- D7 w, s3 `- |: s2 }9 _ case 3:/ B# y9 u7 r+ I7 I- p5 l9 E case 4: & v8 o' W( R+ h' B1 { $ J, G/ E1 A. ~: z: W$ S // 如果上一个操作符号优先级低于当前的,应加上括号 . o f( T/ `% | if(j==0 || Sym[j-1] > 2) # G: v0 f: i2 X# U { ( s1 Q9 o$ V, s/ y: r Formula[len] = cSym[Sym[j]];: |: @& T0 G' V4 L( ` strcat(Formula,temp); 3 C, c; A0 [. E4 S2 K, {& J/ V } 2 h4 o W% j+ M% H7 A else # G1 p4 p$ T Y2 o% Y; T { ( t5 p( X* p/ ? w3 b int n; ) j& f: z! G- K" }$ H* h$ ~ char *FormulaTemp = (char*)calloc(len+1,sizeof(char));$ g1 d0 S! R. J8 @. Y( _ for(n=0;n1 t' r) I4 m1 ~1 @6 U$ [8 Z {8 f- D# Z8 B/ ~5 Y, u- `, B FormulaTemp[n] = Formula[n]; 3 h7 s" M$ p9 q" i Formula[n] = 0;- Q% j! Z* S: j2 x }! O& D e$ c4 X' v4 x7 H Formula[0] = '('; 4 W) P5 B5 q; t4 F8 l0 g9 l. d strcat(Formula,FormulaTemp); 1 [& K5 b% @7 y9 G- T$ O% H d free(FormulaTemp);2 F8 e8 a- O4 n4 D# R7 U$ t1 F/ m Formula[len+1] =')';: H# H3 i" Y- Z; a- _# u Formula[len+2] = cSym[Sym[j]];& d6 s4 x+ a: D7 I% Q strcat(Formula,temp); & R7 q" X3 a" ?! ?4 J } : l$ N; j! m/ v; Q break;$ ^! S5 ?( O5 |, s8 v! ~ }; Z9 D& E3 T4 q* ^& X i++;j++;, c( X/ p6 S# Y7 i }. M1 }9 W8 t0 Y9 U6 I: X$ p printf("%s",Formula); 9 `8 |. y8 l. Q+ Z& Z) E6 L printf("=%d\n",sum); G; T6 u! c) Q8 q- \ free(Formula);8 `$ h" {" J2 A9 ? b1 N }4 b7 J& a4 Z% C `5 O8 L; `& ^ 8 m7 J8 E# {$ u# f+ x( M// 以当前数组为基础得到一个从小到大排列的数组, g0 T. A' _" B9 T+ ?/ T& G // 返回非0表示穷举结束 . ^9 C2 B0 c) D0 j N/ D& Tint EnumArray(int *Num,int min,int max,int count) # t' m5 J" ]6 {* a0 V' E{ 5 {/ k: _1 Q+ H, Z5 x2 M int i,top; + _# A# Y3 z1 z2 Y top = count-1; " @* m: X/ M* ^( g3 ?: g Num[top]++;! @+ B, R u# m8 `( z while(Num[top]>max-count+top+1 && top>=0) ; N8 B5 _, k5 W+ }+ n, h8 v+ J7 { {5 b- a% J0 S* o& {8 d2 ^* n# Q+ T top--;' C1 D) a+ B* G: _ Num[top]++;# M$ i5 `' I( j n. e- |% m }& t) C8 Q. u1 g2 b for(i=top+1;i5 {0 x2 S' k, Z8 |2 |" C { 1 F8 Z7 e9 \5 k7 ^0 p" { Num = Num[i-1]+1;. R( ?- j) e" z! Q8 y' K }8 m" l/ @+ e$ \* E) ^0 z if(Num[count-1] > max) return 1;; z7 \' K5 q1 z. j/ P else return 0;) U' |$ d5 O. V- f }, p2 P# H' S9 g; n# D* B/ _6 N2 I. Y / n% C% @- u# V1 W4 V Y, \ // 不允许重复的初始化数组2 j) Y% O( p. d9 n, a1 k void InitArray(int *Num,int min,int max,int count) 6 [- G. c. [: h8 d{4 \0 c( \3 M- l# f- W1 m0 ~# u int i; 9 H1 L: m( d( r- a for(i=0;i=min+i;1 k l" a6 D, M! l Num[count-1]--; 5 R5 T9 V5 Q4 |( v' _0 s% @, T} / r: q+ y. b5 l- n) A' l$ n " q/ u& {0 Q" `, r. [- C4 J9 l/ k) b: [( B+ I; Z- [" x 2 J( P! y; Y6 e% Y# O - X! a4 M" ?( f
    [此贴子已经被作者于2004-5-2 14:50:47编辑过]
    # ]' ]+ ~8 h+ `# X% `' ]

    该用户从未签到

    11
    发表于 2004-5-2 14:54:00 | 只看该作者
    本法穷举出所有用min - max之间的num个数组成算式,结果为sum的情况4 T4 C. x6 N" I- b; H
    / Y. |; x( H! e% M
    如要具体的话,可以不穷举操作数,直接输入操作数,进行操作符号穷举
  • TA的每日心情
    奋斗
    2015-9-17 00:58
  • 签到天数: 1 天

    [LV.1]初来乍到

    12
    发表于 2004-5-2 15:17:00 | 只看该作者
    以下是引用游侠无极限在2004-5-2 14:41:26的发言:6 g2 d" w6 t+ T, \ #include " n4 C. m% B& {; c( D. Z #include 8 {# h0 ` J& V; n1 ], v1 y/ r: T" x8 v, S+ L int EnumFormula(int min,int max,int num,int sum);" Q9 p$ z: i5 B7 G! s( l& b void ShowFormula(int *Num,int *Sym,int count,int sum);" J* p! E2 _7 c$ k# y! {& R; o double GetFormulaVal(int *Num,int *Sym,int count); ' R0 P# _! x1 Q! v& Y. ^* O int EnumArray(int *Num,int min,int max,int count); j9 ^2 W: Z) T2 W) ]+ p3 P: t; m void InitArray(int *Num,int min,int max,int count);$ j0 N( j+ K$ j% T. A. N C5 C const char cSym[5] = {0,'+','-','*','/'}; . M( J2 q# `/ |( c( r/ N4 Q: e# n8 i6 B$ @3 b% F int main(int argc, char *argv[])9 P" U- _. S5 c6 Q1 ? s { $ L! S" `0 J+ o0 h7 e" Y2 `1 v, i printf("总计%d个式子\n",EnumFormula(1,10,4,24));/ b k: g/ ~6 \% b. T# ~ system("AUSE"); ' [) m. V1 w. k/ J0 t% v' _, z return 0; 0 M- f( R/ r5 ^ }$ E' p( O! D# B) e+ @) J# y : r1 a2 D* E! `1 f- s int EnumFormula(int min,int max,int num,int sum)# q0 K) T" a2 v" W {( H& ] a0 |! a+ w int *FormulaNum = (int*)calloc(num,sizeof(int)); //储存操作数- w# e( h% |9 b* Z; ^0 @ //储存操作符号 + y! z; ~2 O/ e$ Z% v0 Z //最后一位用于穷举结束标记 0 S( C' m d5 g8 o4 c/ J0 f // 1 - 4 代表 '+' '-' '*' '/' D- P3 y9 v) v8 o4 J( i; B- B int *FormulaSym = (int*)calloc(num,sizeof(int)); / w% ~; J2 T! g: z5 A+ B7 s @* d6 z9 p; x W; \9 t int result = 0; 1 T: `1 @$ t* X; E% s& t // 初始化操作数和操作符号数组 ) q C$ X- ^6 k: M " [ x) ~; E k( e- U! C int i; * r0 Q. I9 @* S7 y1 f 1 I* q2 z) ?: [ for(i=0;i = min;: Y1 ?3 ~' |3 v* R for(i=0;i = 1;; f/ E6 \) P% p3 G5 e- Q* v( q FormulaNum[0]--; ' a$ l" r# Z" B! l& H& O; {+ z- N) Y" d% {& s7 T InitArray(FormulaNum,min,max,num);; s) \0 H0 v( L7 B! l FormulaNum[num-1]++;, @. r. m1 Z4 W2 O. Y* c // 穷举操作数和操作符号组合 6 ? ~! {4 I' M, ~2 k$ x G0 ] while(FormulaSym[num-1] == 1) / k: _: w9 h4 | {! e$ |' h+ Z6 j( o" s: w double t = GetFormulaVal(FormulaNum,FormulaSym,num) - sum;- M B( _9 z; n: G) h if(t>-0.01 && t<0.01) / [& r+ _& F' W+ P8 l- M {2 i$ {2 @( I, k) L //printf("%d %d %d %d | %d %d %d ",FormulaNum[0],FormulaNum[1],; G4 [* U* x) x/ t" @, K; w' w' K //FormulaNum[2],FormulaNum[3],4 H- N6 X" Y" n/ B: P! G& c // FormulaSym[0],FormulaSym[1], ( y4 ?$ K7 ~( j7 {: X4 C // FormulaSym[2],FormulaSym[3]); " Z4 d# S; G A) O2 h ShowFormula(FormulaNum,FormulaSym,num,sum);& A6 s i. n- H$ b5 B$ [ result++; ! W( i) l! I8 T, a& E8 j5 x6 [ }7 r% W8 [3 y$ K1 t- z5 @ 0 q9 n9 T& c" y // 依次穷举操作数 6 M2 h! m6 i% r( H5 a / G8 Z0 f+ f; ?+ ` //允许数字重复的穷举 - x5 G/ P! {* M) W I //FormulaNum[0]++;' @# j/ N0 {( Z0 u //for(i=0;FormulaNum > max && i" F4 q. }, C4 Z/ V. ] //{6 X. e9 e$ F5 y, d: q4 i6 ~ // FormulaNum = min; " F, }3 s4 [9 ? // FormulaNum[i+1]++; ' K* Z5 O! Y- T, x! x* k/ f //} " O) `. e/ t: x0 N, c& p // 操作数穷举与操作符号穷举联接/ z3 Q) C! [6 M/ @* ]8 q4 Q //if(FormulaNum[num-1] > max) / K6 N/ }3 v2 ?, r2 h- W1 E //{$ j G7 a. P P% C1 E6 T: P7 z6 O9 \ // FormulaNum[num-1] = min;1 B" Y1 L3 S2 G1 T: O/ r! x // FormulaSym[0]++; - |& g2 s, F: a- D2 T1 A9 U3 I t! p //}1 Y& I e% r. d ) V' k0 A. c" u! L- ~2 o6 v. ~$ ? // 不允许数字重复的穷举. c C( f. |( K2 c0 P0 p // 数字必须从小到大的排列,防止重复 8 w2 `. m% `' Z8 Q& a1 z) i if((max - min)< num) exit(0); // 出错4 e: n* o1 p4 U, a1 @ ' j' `. y: v& t if(EnumArray(FormulaNum,min,max,num))+ S5 b% }* p5 N- F+ F {8 |) L0 x# S3 z6 `( ~ FormulaSym[0]++;# b! `5 _7 L$ P5 Z! f InitArray(FormulaNum,min,max,num);8 K! P; h3 a1 T: Q0 m FormulaNum[num-1]++;( e+ O6 y8 M t4 I/ ~ }0 ^. u4 Q) |$ o& w" x/ r. {& v 4 d% ]' J, _; _3 [, v // 操作符号穷举 7 k" L$ R0 a3 l for(i=0;FormulaSym > 4 && i. Z) V% `8 T$ p+ J {+ g( q1 d; T+ }. M FormulaSym = 1; 6 I* {* Q! t9 A' { FormulaSym[i+1]++;0 O4 u% p& v, l7 @ s9 T }2 N: b& R# U# T7 A7 `' n ) ^5 ~; E4 h5 n) B* q3 x } / d/ D$ t' i/ @# {$ } //释放空间4 S- S7 [# y/ P6 D6 \1 Q free(FormulaNum); % D7 I# h: x0 n free(FormulaSym); P; a- M( J4 j: u0 R' X+ V# b return result; 9 s+ ^3 T) P4 \8 `( z+ y }5 w% t3 L' [( Y) L // 计算算式结果/ q9 s' e$ G; H- Y" I: K double GetFormulaVal(int *Num,int *Sym,int count) , g4 y" J* ^- x- }/ I { V6 g3 p$ c/ Z8 }4 O c int i,j; + U5 d9 I+ M* n; O9 A double preresult; ( h0 v% [3 z" ~1 O preresult = Num[0]; * r" y. [0 l5 M1 J2 T4 ~( M i=1;j=0; * |4 n* `8 A: o+ ~' U4 f while(i$ k! ]; t8 N* i" a3 \! g4 @5 V { 1 _2 {$ X) I" Z8 X$ i switch(Sym[j]) ! I0 j% o7 a0 \ { 1 I) j" T& q( C case 1:- }- M5 G9 P, N preresult += Num; & Z7 Z$ Q4 R3 H' m( l3 g8 r1 K+ ] break; ' \! v* m& C2 n& B case 2:9 M8 j# }) Y7 i6 M. X8 M o, w preresult -= Num;- \$ }3 m$ e2 k& x1 O! c, n8 i break;$ s2 K' c0 ^7 ?& x7 q% a, K6 o- Q case 3:% r( ~4 w' c% o; \, i preresult *= Num; / Z0 ~2 G+ _% E/ S2 a, ]" M break; / r; x8 M! J3 E case 4: |6 p8 }# w! _5 F7 z [1 A2 k if(Num == 0) return -1000; ( R& R& t, m% Y; p preresult /= Num;$ c0 R0 v# A6 p+ P0 m) L break; " ~. j# {/ \- M3 m }" K% t) \; X2 Q3 U i++;j++; & D2 M5 Z) l% P1 p) @ } 8 o0 z2 Y4 o& C. q return preresult; //进行修正8 H4 \4 m7 D9 K/ t }1 O* G, ~- Q% s0 [8 K+ \ // 打印算式 % A( D( l2 b- s/ @ void ShowFormula(int *Num,int *Sym,int count,int sum) + ~: D5 @1 a/ c6 w% d- j8 c {, s* |7 h2 |/ e3 I7 _ ' \8 Q! G$ Z; k) z% e int i,j,len; $ }0 s) I0 u: D9 z char *Formula = (char*)calloc(count*4,sizeof(char)); 7 J* Z" l0 w2 F3 \$ Q char temp[10];1 ^" g' C! ]) K* F2 j itoa(Num[0],Formula,10);4 R4 g+ ]. p* e0 ^ i=1;j=0;! e) y* {" q2 S% [3 w2 Y# ^( v while(i' W7 E$ W, D7 r7 @, } {' E2 r/ U: ~$ q. v# |5 z# i itoa(Num,temp,10); / ]$ l1 V7 \6 C, b; t4 } len = strlen(Formula);( J* O3 [1 G' I6 ~; q# ` switch(Sym[j]) - P8 S- O; l: g: F( a9 ^ {' }+ V- ^: {4 j. {8 P0 b case 1:5 f D$ d, W7 B' h9 ^ d case 2:6 I$ U7 i7 {8 a' I# d- Y- H Formula[len] = cSym[Sym[j]];) f, `& x6 f4 X* \; d strcat(Formula,temp); 7 \+ y1 g0 n( `3 X1 m1 N break; # K+ Z& f4 V' {; Y% W3 W case 3:0 s# t( y& k% T* w. X case 4: 0 C0 s( d$ M1 G: | @9 a a" B3 m2 M* o ~ // 如果上一个操作符号优先级低于当前的,应加上括号 ; I m' T3 i' t if(j==0 || Sym[j-1] > 2)2 t% | b8 p9 G. U; l { ?2 c2 I' n( B8 S- n Formula[len] = cSym[Sym[j]];. `# ]: t: p4 Y: e5 O' { strcat(Formula,temp); $ D4 `( |" n7 e2 U } 2 {# }! o5 C' \8 T i; o$ Z else + F8 y& r8 L7 Q3 n. d { 0 O6 T4 n$ i( V* h( r2 g7 y int n;4 Y) v3 R9 o5 L, O$ r5 U% T char *FormulaTemp = (char*)calloc(len+1,sizeof(char));- i. _6 q5 O$ R3 _! V& b+ Y for(n=0;n7 C9 f/ e/ ^: M& [2 o {6 R& N& l- e- V. D4 E FormulaTemp[n] = Formula[n]; ( [; R4 t, }% O4 x! o Formula[n] = 0;! U+ Z0 D& r3 e9 Y6 [3 \* P6 J }' |" ?$ f) _/ R" t- Z/ z Formula[0] = '('; % Y0 @6 o* S t: n* e, o strcat(Formula,FormulaTemp); 9 x& h2 w- j e- u free(FormulaTemp); % M( p: f. M, D7 H( P. I Formula[len+1] =')'; " P( B. [6 T ?% P Formula[len+2] = cSym[Sym[j]];+ E7 b' \" i2 E" p strcat(Formula,temp); * m' u0 R) z; Z& m1 v }" j: W3 N, E c break; - T3 G+ _) ?% }9 t7 v4 B# f } X1 N9 z+ D3 [ B7 } i++;j++; 5 L8 r! A1 w) I+ g }" ^$ y$ ~/ F9 V" i0 q/ j printf("%s",Formula);' h$ e5 B% Z* ^- `6 i printf("=%d\n",sum); & ^( I4 u8 N5 ]2 Q. s* g4 B9 X; n free(Formula); ' m( C9 v7 r* ~; A }) u4 p6 G, S' m- x ) ]2 F7 Q* v2 c( T // 以当前数组为基础得到一个从小到大排列的数组 ! _4 V7 r# B0 P" h3 S& T- q: B // 返回非0表示穷举结束 9 s+ D8 a! R% O int EnumArray(int *Num,int min,int max,int count)9 |$ R3 |* o6 z5 m/ y {. \% h3 u$ A' E: ~' s5 P# k int i,top;* i; b5 {. ~2 Y- w" r$ D top = count-1;/ f6 N y4 Q H+ v7 o Num[top]++; & j# F! h0 ?1 A6 w3 M. H- K6 [ while(Num[top]>max-count+top+1 && top>=0) ) Q% L# |6 p/ H- O# b p/ ` {" s m6 }9 o, C9 j' F top--;) G! D( z6 {4 A# G# a Num[top]++;1 V$ E& M c3 h }( X) r$ r; [- e# o0 _ for(i=top+1;i2 @: i/ l* j& r; U) ~) G# ^ { $ W9 F1 K) j! G Num = Num[i-1]+1;( K( {% E& B) E: _ } 9 Y( c9 ]6 H3 c# r6 o+ ] if(Num[count-1] > max) return 1; # g0 ^4 X R1 O2 a, o! q% [ else return 0;8 ^/ y- e7 G# ? K9 ?( R( G }8 ^# u1 z# F1 @2 @! y' W' P $ L& I, c9 |- a7 i // 不允许重复的初始化数组0 u k% J n" a( u0 [. e void InitArray(int *Num,int min,int max,int count)+ D" S/ G# R3 u8 W {) q: f' v; \2 v! [: D int i; 9 X0 r) N' ]) f {! B2 H* L for(i=0;i=min+i; + D6 S$ {% B2 Y8 _9 k2 ] Num[count-1]--;0 e& ]* _& U) _# C }5 c7 E# S7 i8 _ 2 w5 L0 v3 d( X. X( p1 D 4 _" r. o: B) Q- o) ]( l" p( E: {& |# k, i8 _1 S8 n. t' o: {# Q* I ; ?7 ]0 D P0 o4 V: v' c# ~7 Z1 m
    [此贴子已经被作者于2004-5-2 14:50:47编辑过]
    7 H8 R& h3 u) A, t [" c( y5 G 6 d$ a1 i/ f6 a4 Q, I( k printf("总计%d个式子\n",EnumFormula(1,10,4,24)); 的运行结果是:/ m) d# v5 Z) W4 p6 w, h 1+4+9+10=24 k; E4 U2 } C- ^7 f1+5+8+10=24! A( f8 D1 z& M U. R# x4 R- Y" J 1+6+7+10=24 : n! _* W5 B0 u3 N1+6+8+9=24$ ]5 x) t2 v+ }8 {9 h" \ 2+3+9+10=24 $ j7 o" g. V- a* W i( o2+4+8+10=24 # T1 q5 J5 A" Q2 M: h2+5+7+10=248 G/ m6 c9 t4 e# x* V2 C! S 2+5+8+9=24 . |2 _4 `& k+ h, h3 D7 S/ b2+6+7+9=24 * @5 B8 k- K( M/ F3+4+7+10=24 * w- U- O: k/ i6 e3+4+8+9=24 & a, e3 S3 u# x! ^: q5 [( E3+5+6+10=24 . `0 H7 a$ `0 }0 P6 H2 y3+5+7+9=24 7 M$ z! q4 W0 P3+6+7+8=24* E* H4 j& g: f$ I' n0 `7 a 4+5+6+9=24: m$ H3 |( u5 T 4+5+7+8=248 K5 Q* G- {! p' z5 Z 这是什么意思?似乎是找出了 1 至 10 之间的和是24 的数据,这和完成计算24点,差很多吧? 6 a# s7 }; y" w, u) v2 F比如用户输入 2 ,5,7,8 程序应该能得到计算这四个数据得到24的表达式才行啊,这样就可以写一个游戏了。 3 }0 [) u; H, Q$ y# I/ y如: 1,5,7,8 有如下方法可以算出 24 6 a- [# d6 w2 q0 }((1+7)-5)*8 = 24 . d% M+ [7 b, J4 G" t' e((7+1)-5)*8 = 242 K# g* B1 [. f2 h6 d0 x9 s; e% V (1+7)*(8-5) = 24& ~4 Y. v, r3 L9 _$ F (7+1)*(8-5) = 24$ |" |5 [7 M: q* N ((1-5)+7)*8 = 24% z7 v [8 Y; K- |4 ]8 W ((7-5)+1)*8 = 24- _) X* E1 G% ^ f (8-5)*(1+7) = 24 % p% a' \7 O; d/ `(8-5)*(7+1) = 24 ! a4 u6 Q$ c$ v7 a8*(1+7-5) = 240 g+ {; y( a; @% _- l N 8*((1+7)-5) = 241 d0 w4 x% w: A5 v4 L 8*(1+(7-5)) = 24 $ O! f. G) Q- D S, e/ Y8*(7+1-5) = 24: o1 \8 g' h# a& R' `5 U/ U# a 8*((7+1)-5) = 242 M% v, [/ R5 s) a1 _ 8*(7+(1-5)) = 24 8 l' e5 h& t5 o1 M# `9 L, m$ X8*(1-5+7) = 24 ) a; q0 `0 n2 B3 m q/ K8*((1-5)+7) = 24- i3 I# K$ f8 y8 R' p; D$ k6 k5 k, X 8*(7-5+1) = 24 , ~; ?( s2 ]& E/ E5 m8*((7-5)+1) = 24 . N% ^+ T6 B8 q, k9 d' @

    该用户从未签到

    13
    发表于 2004-5-2 15:21:00 | 只看该作者
    结果是这样的:2 L. G) D, u% z* Z+ j$ W
    1+4+9+10=24
    1 l4 z; L+ j* W0 M* L* c5 {0 l1+5+8+10=24% b! @5 p0 b, x! `
    1+6+7+10=24
    ! U6 Q4 p6 H0 b$ H4 {& d* u1+6+8+9=24
    * {- [) v8 e+ N% r2+3+9+10=24
    * }! y6 U; b% i( k, m2+4+8+10=24
    . n+ g0 w3 W) K4 Z2+5+7+10=24
    ! Z6 R2 K+ l. e6 o9 {! H6 T( j. r- L4 w2+5+8+9=242 A9 E4 y) D- J8 M
    2+6+7+9=24
    3 c! U7 M4 Z" o; p6 Z3 \3+4+7+10=24! _' c' `+ g# h9 R6 r
    3+4+8+9=24
    ) o7 }4 x4 G5 c2 b0 P3+5+6+10=24
    ( Y; B1 Y4 x1 W5 D3+5+7+9=24% u1 w. X, l7 b9 W
    3+6+7+8=24( h! _$ q# b1 o
    4+5+6+9=241 b8 f: [3 u2 g' Q( R( k2 D
    4+5+7+8=24) ?: R- \; J8 v2 l
    1*5+9+10=24. B' O/ S9 v* R+ M
    1*6+8+10=240 z+ u) y2 a1 V& x* P+ ]. v& f! s
    1*7+8+9=24
    : Y0 p% p/ h* t1 ^2*3+8+10=24
    # f$ ^# x8 F+ W+ K$ _1 ]1 U2*4+6+10=24
    7 V# ?. G: B, M9 A* n  L2*4+7+9=24
    ! m9 s1 U2 k! J0 p2*5+6+8=24  T: t7 t) G4 D3 i# \6 k5 R) \
    3*4+5+7=24
      l& |4 N  A5 Z3 h, w, |4*5-6+10=24
    " |4 e3 _, a( i% f) F, z9 |(1+2)*5+9=24
    9 X1 B- y9 F) V& ^8 ?% r, \(1+3)*4+8=242 P. x' H: c+ q* N0 C
    1*2*7+10=24* L+ l. M% @6 v5 Y
    1*3*5+9=24; n/ k' R1 a) b" |& P
    6*7-8-10=24, k  D7 o+ Q3 R1 k9 }
    (2+4)*5-6=24
    - k$ [. Y6 @! o) P, @" k2*3*5-6=24
    2 C2 N; K+ q7 o' u+ A3 a(1+2+3)*4=24
    0 a6 t" s: d0 B(1-2+4)*8=24, g+ o3 Y- Q) @% i$ u$ M
    (1-2+5)*6=24
    ' g# s" v9 E2 q3 y; |(1-3+5)*8=24: I# k  ~7 M* ?, n
    (1-4+6)*8=24( w- s1 {' `, Q0 j
    (1-5+7)*8=24
    , q* p9 P/ g7 L4 s1 r(2-3+4)*8=242 f% n3 G5 k) T4 u2 W- _1 _
    (2-3+5)*6=24. Y  |1 Y% i5 s9 w: m7 E
    (2-4+5)*8=24  W& z" e% Z. [7 y+ M, D
    (2-5+6)*8=245 H$ P" a, d9 i/ p
    (2-6+7)*8=241 c5 B8 O# B; j
    (3-4+5)*6=24
    ' ~% |6 P/ y+ H* T(4+5-6)*8=24
    : l  e; T, V) |# L(4+6-7)*8=24
    - f8 A3 j- w. r9 P# s(2*4-5)*8=24
    & N% A3 S& v& J: v9 p(2*5-7)*8=24
    4 F+ {. v9 O& E7 u; Z, j1*2*3*4=24
    * b" t. L( o( X5 s% S0 d4 f1/2*6*8=244 |% A' z* b* J/ i
    1/3*8*9=244 i: ?: P* U: }! ]  G  b, Q
    2/3*4*9=24* I" t$ }% W, V4 x' p
    2/4*6*8=24, [- G! J6 ?/ Q& s7 F% ?
    2/5*6*10=24
    ( L0 W1 L! Q! h; d2/6*8*9=240 y0 m+ Z3 s4 E- k$ x
    3*4/5*10=24& S2 s) K4 ~% X
    5*6*8/10=241 y8 Y8 x' [# n; K4 i
    总计57个式子

    该用户从未签到

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

    [LV.1]初来乍到

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

    [LV.1]初来乍到

    16
    发表于 2004-5-2 15:28:00 | 只看该作者
    (2-1)*3*8 这个算式你就没有啊,这4个数字的组合都没有出现+ w& Z4 m7 q$ i6 _8 t6 q, V
    ; L! D, y, u4 R" E: o
    , F5 q3 C8 |! `$ Z9 Q( H; a6 f
    % U) g' _- k$ T. ]/ t; o& Y
    & f& x4 R/ |1 l' j  f

    ! ^$ U3 k- q6 g3 Q
    0 J. Q* L: L8 A! S* j' x( y0 Y
    [此贴子已经被作者于2004-5-2 15:32:12编辑过]
    $ a) f5 W6 l. w& 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 | 只看该作者

    9 [( o$ v- r0 \/ H2 t3 I6 m
    + b2 C% k' F8 J5 S" T; H用这个好了,只不过输入的时候要按从小到大  L) b/ v( f/ m. Y8 V* M
    3 C% s. _! J8 e3 I. [) {
    好象有BUG,我暂时不太清楚

    该用户从未签到

    20
    发表于 2004-5-2 15:38:00 | 只看该作者
    以下是引用yzhlinux在2004-5-2 15:28:15的发言:
    2 w) {3 ]9 ~' t+ y) }2 ~! ?(2-1)*3*8 这个算式你就没有啊,这4个数字的组合都没有出现
    ( |* l7 {/ a9 A" k

    - H2 d! P9 ?" F* t本来为了防止诸如
    ! K& H! r. ^& R! k  p1*2*3*4- v2 K0 k- V* q: Y+ G
    1*3*4*2
    9 K7 R- F/ {. ~0 a4 A  |: W) q- Z2*3*4*18 ?9 Z" ^) e! D, b0 f
    等的重复,只使用了从小到大的数组,不过这样好象也丢了不少可行的式子
    1 {7 @, b7 V: k+ Q  t5 g* e2 o
    ) r9 i& U* a1 v8 B  K另外你的程序就是有这些重复的! }" M- {6 \, O3 i1 T1 l
    3 u) S8 x4 ?  v! i
    PS:VB的程序感觉就是慢好多啊
    # T) m$ Z% J5 ^/ M* G. a/ L6 o
    [此贴子已经被作者于2004-5-2 15:42:01编辑过]
    : _8 d# h$ N* Z8 E  B1 W3 Z- `

    本版积分规则

    关闭

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

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