下沙论坛

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

QQ登录

QQ登录

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

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

[复制链接]

该用户从未签到

跳转到指定楼层
1
发表于 2004-4-27 17:53:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
就是扑克里的24点游戏,4个数,+-*/得24……0 {5 ^$ Y% ?6 v  a6 o
& {) A) u& l4 d+ ~% L, u+ L2 t
偶还在想……
分享到:  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的发言:+ J! Q* c& q% W7 }3 ^8 ?
    穷举法吧
    4 D  T% M, e9 t0 Y: b! 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 则表达试就是我们要求的了。比如:2 E' I/ v- f( z; ^
    function GetMach(A,B,C,D) as String       '得到一个字符串组合如:(A+B*D)-C, t) i8 c( C  s/ Y1 D( f. \( E
    function GetValue(MachString) as Float    '得到字符串的计算值 ,可能是小数
    ' I  F3 s' q2 z' V; ]那么程序就好写了:; s; p6 m, k. e8 R. Z: m' V' H
    GetNumber(&A,&B,&C,&D) ;    '得到ABCD则四个数字,赋给A,B,C,D四个变量- V8 B+ b1 T- ~+ k1 w
    do{
    ; C  n) G/ Z- ~' ~  e) w  MachString = GetMach(A,B,C,D); '得到一个表达试的字符传
    / S+ X2 {, c+ g3 J3 ~5 I  if(GetValue(MachString)==24) break;
    ' {) |" N: H) C/ q4 o}3 D' |5 G' x# i$ c* w; T5 K
    print XXXXXX;+ u2 Z; F$ t2 M+ ]9 l  E  X7 t

    该用户从未签到

    7
    发表于 2004-5-2 11:57:00 | 只看该作者
    我现在试着在写,就是不知道有什么好办法解决重复的算式问题,比如- {" j8 y7 G/ Z$ `+ M
    (5-2)*8*1
    / @/ U/ u  l& b
    9 Z0 p* d: {2 q8 @(5-2)*1*8 $ a% J) O. r0 s+ b# w- M
    8*(5-2)*14 p3 o+ A; H- W9 d2 W4 G
    等等
  • TA的每日心情
    奋斗
    2015-9-17 00:58
  • 签到天数: 1 天

    [LV.1]初来乍到

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

    ! t1 R5 O* s; X6 [9 M8 j; F. O, K
    花了一个上午,终于完成了
      `4 C" y% `3 Z( j4 J/ e你参考参考吧,哈哈
    2 }8 }7 ]' w7 W5 p8 ~2 D; y2 Q+ Q8 h

    ! b# ?/ J, o+ J7 ~! H+ A3 c
    [此贴子已经被作者于2004-5-2 13:43:13编辑过]

    3 w2 U( V# [6 b
  • TA的每日心情
    奋斗
    2015-9-17 00:58
  • 签到天数: 1 天

    [LV.1]初来乍到

    9
    发表于 2004-5-2 13:42:00 | 只看该作者
    上面的发现有一点bug,# ^' C9 D& D& {
    这个改过了
    / S3 v* {$ z8 K* ^3 Q# v一个计算 24 点的小游戏& h7 u" n& e* k" C
    VB 编写& y7 j6 D1 f. f" m- `

    8 A+ ^2 U9 T7 H$ }
    . \1 }4 K5 e" e/ {1 \! w2 \- f: L
    [此贴子已经被作者于2004-5-2 15:17:46编辑过]

    * o! u! t% f, X* |/ Z5 W+ [

    该用户从未签到

    10
    发表于 2004-5-2 14:41:00 | 只看该作者
    #include ) c- @8 L `- D# Q1 \; W#include / M6 o9 J8 k4 v* m1 W3 j ( m1 A$ g5 N7 aint EnumFormula(int min,int max,int num,int sum); ; P$ R! i+ R! g- N/ K0 l& Xvoid ShowFormula(int *Num,int *Sym,int count,int sum); , n# C: U2 @5 D& B0 h/ mdouble GetFormulaVal(int *Num,int *Sym,int count);) |* }: d) L. W2 A int EnumArray(int *Num,int min,int max,int count);$ n7 [4 f2 ]; N void InitArray(int *Num,int min,int max,int count); 9 q6 }1 H5 j3 N. c* Yconst char cSym[5] = {0,'+','-','*','/'};5 w7 r# P4 t7 |2 O9 S3 b: ? $ D1 ^# y1 T" V( ?/ |int main(int argc, char *argv[]) & F: n6 }" i% b2 V' ^4 X* c{0 [" o! H3 B# [; _, t printf("总计%d个式子\n",EnumFormula(1,10,4,24)); 1 q/ X- U; {1 i3 G- H$ Q( x5 _ system("PAUSE"); ' x" d1 [. ~& H" g4 A# ~; ~ return 0; , L5 X* I( r3 \, r4 ]" Q+ k# Q2 F} ; v+ Y) t3 p( S* C% T% Y7 |; Z' T- J' ^9 w! n" Y8 F6 u int EnumFormula(int min,int max,int num,int sum)3 ?+ {( k3 k6 A# u: C+ v { 9 h. i# G S7 `& e# q! p int *FormulaNum = (int*)calloc(num,sizeof(int)); //储存操作数9 k& P0 W+ r% E( [: ~4 W/ p //储存操作符号 t; B. V- p( n# I! o$ B //最后一位用于穷举结束标记 ( L' I8 D4 ~, X" x( |- T' p7 a // 1 - 4 代表 '+' '-' '*' '/'8 N4 N9 }0 ]3 [, n0 i4 O, v2 P int *FormulaSym = (int*)calloc(num,sizeof(int)); 1 |9 s3 j8 \, ~, R# h" R0 \ : T7 |$ P- P: Y7 w% P6 k int result = 0; . [/ O% l# k( e' U) K5 B // 初始化操作数和操作符号数组9 \& {& ]6 Y" K7 h( `4 ?4 h 1 R4 A4 t3 n% [1 W int i;# c) ` G9 j% K8 E' c; X% n 8 X' U2 }8 X9 g0 S- G8 j# Z for(i=0;i = min; ( A1 }/ a7 H; y3 g% G& T for(i=0;i = 1; ) p2 y1 X/ p1 M3 k: u FormulaNum[0]--;4 z8 ?" E. c* x/ Z, D # k* E# T8 M, z" y! r# u4 d InitArray(FormulaNum,min,max,num);7 F% ~1 L+ q, {6 m$ `- n8 {" x FormulaNum[num-1]++; . j3 }8 C# |7 V$ Z' A8 s$ q // 穷举操作数和操作符号组合2 z; R! `: g' M while(FormulaSym[num-1] == 1) # U: r+ D$ {5 P { 6 N1 O R) d4 g# \& v double t = GetFormulaVal(FormulaNum,FormulaSym,num) - sum;; w% b1 r7 F5 l* F" |9 X/ {7 j$ Y; \ if(t>-0.01 && t<0.01)- B% W, ]$ H4 D: \8 H# O$ _7 \ { ; |3 x1 b& M& F7 }1 G% \* y% Q" L8 } //printf("%d %d %d %d | %d %d %d ",FormulaNum[0],FormulaNum[1], " R* F) I+ F1 }. P$ \! D( R //FormulaNum[2],FormulaNum[3],, X5 i; G B2 _# p! O // FormulaSym[0],FormulaSym[1], * e* S" g! O9 l! e) h! @- ] // FormulaSym[2],FormulaSym[3]); 5 d; n2 q! L; p" t. J ShowFormula(FormulaNum,FormulaSym,num,sum); ! Z5 `* U, @% E" u, i) B result++;. L7 g* R: s. z) w. {9 w } 2 x$ V1 {/ f: N # ^ s# x( r& P& S# W& k // 依次穷举操作数 : Y! n- Q- @! j$ b; J5 U & e" t }( R- x% {& Y' U1 i2 v- d //允许数字重复的穷举& Z7 R& \2 C1 N2 r* C //FormulaNum[0]++; + b# |: Q! Q' {) W. P //for(i=0;FormulaNum > max && i & ]. B$ ?' U m' i6 a3 l //{ $ R8 \& D" U" E3 H- d1 k; F) e // FormulaNum = min;$ Q% k4 T4 o0 k8 U4 L7 `; @ // FormulaNum[i+1]++;$ N2 h' I9 I2 E; }. _; z3 m //} ) d" K& J4 V) i1 m# h/ ^5 s // 操作数穷举与操作符号穷举联接 : k) r$ N$ @* r5 a //if(FormulaNum[num-1] > max) / u/ W) D9 A$ F+ l/ i8 `' g //{ ) ^' m. V8 M3 _' K6 x0 K // FormulaNum[num-1] = min;# ]: u o0 @5 X/ q) n" `" v; ^$ J // FormulaSym[0]++; - Q: t8 I* S+ n/ j //} 7 T G' x1 f- V( M+ _0 o# I" K# E2 y7 Q, g+ n0 [ // 不允许数字重复的穷举$ Q3 L2 f# Z1 H // 数字必须从小到大的排列,防止重复' @6 m* @. P7 Q; \( h if((max - min)< num) exit(0); // 出错2 _" r6 x1 }; N6 \ 0 H; d$ W6 ]& C; i) A! ^0 A if(EnumArray(FormulaNum,min,max,num)) Z1 u2 d! c& |0 Q- `+ L { 0 I1 K( I! t; n FormulaSym[0]++;) k" ~- t" b! W InitArray(FormulaNum,min,max,num);3 e* |7 ~" s7 Z# o FormulaNum[num-1]++; ! K; S/ S1 q# B9 ?. b! [ } I- a6 A# ] ? P4 u 6 O* A5 c/ q- k8 t // 操作符号穷举 ) j% Z4 |; [5 z! z! S. Y for(i=0;FormulaSym > 4 && i7 ]1 v g T2 m. S7 H { + K u \- E* P( u FormulaSym = 1;9 N! |$ |8 h) }8 a8 @( w FormulaSym[i+1]++; x4 p. X& j- a8 O }* O$ M. Y/ f1 e, e 6 a. O3 n0 @0 z# ?" G4 S) [$ ^ }+ J" A l& x6 _# W- b8 ~# d //释放空间5 u/ {' v% D# z free(FormulaNum); ! y( f: c& _1 }! a2 ] free(FormulaSym);- A" j% a; v. M: Z" `; o6 A return result;5 T0 f. v3 o: V" s' o1 I& r }9 I# w, d0 z* q2 _ M) g, @ // 计算算式结果 - Q! }7 {5 f$ l- b/ bdouble GetFormulaVal(int *Num,int *Sym,int count)! U' ?" w$ h- ~: Q, z: _ { " {3 X+ d- H w6 k5 n8 }9 y! i; a, T4 F int i,j; 3 ~' B6 W2 X( v double preresult;! a: _7 h5 Y0 S0 g5 i, S; d& S preresult = Num[0]; S/ L* {* a/ }- A, C i=1;j=0; ( m2 }, m& _( g! ^ while(i/ X0 n9 @ F; S. M$ B4 c {/ a; ~4 X- u% H" P+ }9 j switch(Sym[j])# h/ p/ @7 g" R( F3 i& e0 W { 0 j- [2 j" i; V$ u case 1:5 ^/ c9 s* q# J( _/ X% Z! n$ Z preresult += Num; ) J5 G- W. t& p( O6 R break; . E& |1 {4 E; p0 r' E% v# E6 k case 2:" d% v) ?$ s* v, s; ]9 h! D& P6 S preresult -= Num; 8 @8 d$ q6 ~$ [" k1 w break; . y, j X W+ o$ V% ~+ d case 3: ' g" Z: M) [4 k; ]6 | preresult *= Num; ' a! {, L6 [: e7 Q5 U- q# @ break; - z; U' E j0 s( G8 n d case 4:! f# k5 d- C. | if(Num == 0) return -1000;3 |3 j& {5 R6 n2 Z. C5 F n preresult /= Num;5 v( R3 ~- h @* q& a$ N0 W& A" S break; : h. ] `: x6 r" K } % `% O, b/ I* c0 @ i++;j++; & M8 T! I9 Q* S! \" r% x% o } 0 I. m6 C; Z# ]! T1 J7 Z return preresult; //进行修正* l, P3 x- W- F9 a# r }) k) ]: t% ~, {0 a" A // 打印算式 0 e4 _5 [( @; Vvoid ShowFormula(int *Num,int *Sym,int count,int sum) 5 O) h7 b7 ^- S, V; Z{ ! d9 F, T/ I4 @# N. s4 B0 ~8 t ^: u& {7 v) N, P int i,j,len; & H- `! s; r# n& t( `$ V( _7 X) x8 [ char *Formula = (char*)calloc(count*4,sizeof(char)); " ^; T h! Y% N1 ~) j char temp[10];; c6 G7 b, |/ d itoa(Num[0],Formula,10);+ v1 y2 F: M( q i=1;j=0; 3 C: W5 y9 `' y$ E) r while(i/ p! {. S6 E6 N4 @& ` { 6 L" Q+ B9 V$ ?$ E" C# _) E+ F itoa(Num,temp,10); " p' X: _3 e) w3 @0 x: j8 a' Q% q len = strlen(Formula);8 M! `9 f$ j' Y) u switch(Sym[j])# y% N2 I8 F! ?2 L0 D. K {7 l+ i! v3 T& X3 W) y: z case 1:" X" U4 P, i* x o6 X2 t1 E case 2:) o- P( t* t! l4 X Formula[len] = cSym[Sym[j]];) @) O+ H! B$ E* k5 y' R& T$ R3 @; y strcat(Formula,temp); ) |4 K( q3 ^' q) E break; & M5 n0 `2 O; a" C$ Y* a case 3: 5 J* j& P3 w! n/ H! u- Z case 4: 0 L, M, ]. F7 N" Q N + Q6 a: U8 r; [. @& a // 如果上一个操作符号优先级低于当前的,应加上括号, k' N. v) q4 x: e" r* |" M, z if(j==0 || Sym[j-1] > 2) 0 p& \/ r- L: y. B { , s. \2 g8 |3 u0 ]! i" e& x: @5 N" A Formula[len] = cSym[Sym[j]]; % G7 ]# E0 Y3 R% n strcat(Formula,temp); 2 G$ s3 H5 S( {9 Z1 A }1 x7 b- @" ~7 m8 ~ else * H! J* ], N3 A { $ R, {) S6 c2 e/ e6 y* g int n; ( x- X/ i: m/ E, b char *FormulaTemp = (char*)calloc(len+1,sizeof(char)); - D U/ B( J7 y0 \& Y for(n=0;n$ y8 g# m- l' _3 h" Y M- u {1 P+ `4 L* ^( j3 N' D3 ?" y FormulaTemp[n] = Formula[n];/ V! {0 y, i1 C* C; | Formula[n] = 0; - I3 X, C8 H0 z } 7 t9 `& V( }6 v! r; @ Formula[0] = '('; J) o3 [: x8 N ]! D strcat(Formula,FormulaTemp);6 |1 ~; E/ N3 X& n, m: o free(FormulaTemp); ' t2 j, F% q) b8 `% l Formula[len+1] =')';' W; Z! {* O Y" Q/ X8 y Formula[len+2] = cSym[Sym[j]]; 4 t. z x$ {: U9 o: k strcat(Formula,temp);5 W: C; M; R* s$ v }! T. ~8 X- x* z0 P1 v% _- \ break; - e( V- B% N8 v! d/ Y } ! X7 Y" {( v3 K1 S6 J1 Y i++;j++;) p5 h. I+ \4 r1 ]0 I3 Q, | } ' W' H" m8 [5 N! L( E! Q# v" v: D printf("%s",Formula);0 i' c$ }) a1 f printf("=%d\n",sum);7 ^9 v6 g8 j* R ^7 h; |$ _ free(Formula); 5 N4 b* x( V9 Y& M} . P# J6 K; @2 R1 p7 I2 C4 I/ p* m, h( \4 C0 U' i9 b // 以当前数组为基础得到一个从小到大排列的数组 8 d. w* L' q1 {3 h7 a$ \// 返回非0表示穷举结束% n) z8 b3 z% ~ int EnumArray(int *Num,int min,int max,int count) - \5 Y( S2 r% M0 ^) \{! }0 c8 s" e, f; o/ o int i,top;0 D1 X5 B( O9 o8 ?# j& I) M top = count-1;9 s7 B1 i9 d- p, b& p" M1 ?5 o Num[top]++; + c" }) `4 s' b while(Num[top]>max-count+top+1 && top>=0) ) g2 Q) q; \' d5 X9 t { - `/ A" I7 F* r top--;4 ], M- Y$ V/ \ Num[top]++;& Z7 A5 `6 S" n }! l6 o% U! q3 o) _* L$ D for(i=top+1;i! a9 \6 t6 J/ r& t& \ { % r' b0 u% g X( p Num = Num[i-1]+1;, y! ]6 \6 t/ C5 _4 N7 @ } ' a: |" Q( K6 s if(Num[count-1] > max) return 1; " F h& l) }2 t else return 0; 5 n& G/ @/ V( ?2 U2 f} {" ?" g/ H% }6 M+ g. c4 f { & e% {3 A; |# R6 T5 B5 A* |$ i) r// 不允许重复的初始化数组 ' u! ~+ O$ y/ V; ^8 N2 |void InitArray(int *Num,int min,int max,int count)* A$ a/ h. r" v' A {/ Z' A c9 K' [$ d' F int i;/ c- Q7 u& u& k( m R" l0 G( e for(i=0;i=min+i; r; @1 L8 K0 y; l Num[count-1]--;: u( u2 k" b! o5 _4 H! k# ?* T }9 N( Z8 |1 t8 {. p2 _9 W2 n+ d * {- v9 L' G( T2 p- ?1 X" A& t4 q, Z6 L4 s% M * `- x7 U6 H0 U" N3 o / X7 F: O" G/ F
    [此贴子已经被作者于2004-5-2 14:50:47编辑过]
    ) ^: ~/ W2 w" \' V7 c9 _9 s

    该用户从未签到

    11
    发表于 2004-5-2 14:54:00 | 只看该作者
    本法穷举出所有用min - max之间的num个数组成算式,结果为sum的情况
    : u$ P2 L5 O3 w& ~+ n- {- r3 b( M
    如要具体的话,可以不穷举操作数,直接输入操作数,进行操作符号穷举
  • TA的每日心情
    奋斗
    2015-9-17 00:58
  • 签到天数: 1 天

    [LV.1]初来乍到

    12
    发表于 2004-5-2 15:17:00 | 只看该作者
    以下是引用游侠无极限在2004-5-2 14:41:26的发言: 9 j" E; m" V' H' ?4 ^#include + P" {3 \5 l7 G) M #include ) i- q, C& ^2 p4 s; W+ Q. K" R 1 @& E' J$ w0 _ int EnumFormula(int min,int max,int num,int sum);; L4 P2 f: j( z3 J) P1 ]6 Q void ShowFormula(int *Num,int *Sym,int count,int sum); 6 T" K7 ~2 y1 I; f2 F double GetFormulaVal(int *Num,int *Sym,int count); + m" o9 E U) X3 g int EnumArray(int *Num,int min,int max,int count); 0 q h% f/ @3 G8 u: B1 V' z8 v' F void InitArray(int *Num,int min,int max,int count);2 a, s$ ^0 U3 ]' V4 i const char cSym[5] = {0,'+','-','*','/'};8 G$ M, Y. e8 W, ~ + o4 E$ j7 E3 w int main(int argc, char *argv[]) 3 K9 v \- {9 j0 P' G) x2 } { B! M" G% x; K3 @ printf("总计%d个式子\n",EnumFormula(1,10,4,24));& Q" \( [. z6 ? system("AUSE"); / _$ }( ~4 ~! p5 r* l- u1 k# i return 0; / f$ y+ Q; X! O- T8 h }; J' u5 b: E' _! K6 r 5 f; @! L% @# G% w. g' o, a- C5 j int EnumFormula(int min,int max,int num,int sum) 2 Z) |1 }8 y$ P+ S( G {0 x4 e% g" } G0 V; x# K& h+ e7 s int *FormulaNum = (int*)calloc(num,sizeof(int)); //储存操作数 $ c. @+ ?3 ~/ L4 ?; V //储存操作符号 4 Z& f/ l" z/ O+ l% G j //最后一位用于穷举结束标记 7 I3 ?/ x- k% f+ {& S( z // 1 - 4 代表 '+' '-' '*' '/'4 O7 Y) x3 d* V9 B5 z int *FormulaSym = (int*)calloc(num,sizeof(int));* l2 E( j$ v; [3 q& H/ v 7 y$ h- d2 S6 W5 i5 u! Z int result = 0;2 B; {7 i& B& b: K" c // 初始化操作数和操作符号数组 $ ]' Q1 m0 D' [4 P, f; R. n " |- \" H0 R3 H int i;+ J! o8 z& E% Y6 B8 c* s" |. _ - y$ }# }& D+ S3 v for(i=0;i = min;' l1 l. N/ D. O# J. t for(i=0;i = 1;- d7 D% Q/ ]3 P+ O& d, M4 O" e FormulaNum[0]--; 0 W1 I4 S4 C. u( s/ K8 H' k+ v9 u1 I6 G) O InitArray(FormulaNum,min,max,num);/ r% m {& \- g* v5 S" @) i @ FormulaNum[num-1]++; 4 T, P) o, X, G L" q6 \. y // 穷举操作数和操作符号组合5 g! r9 Z! N/ `( I while(FormulaSym[num-1] == 1) / W- q, ^; f9 o% R { 7 z& e, {# ]1 T% O7 j( v4 T* O& J double t = GetFormulaVal(FormulaNum,FormulaSym,num) - sum;; D8 O; w, B4 L0 P# ~ if(t>-0.01 && t<0.01) K2 c% S9 i& [9 b( k8 f" B# x$ b {+ ~6 _* W G) k- X/ a3 i //printf("%d %d %d %d | %d %d %d ",FormulaNum[0],FormulaNum[1], 7 B$ t9 l5 N1 ?. L //FormulaNum[2],FormulaNum[3],$ w+ W. c) i1 n* i7 y: K: N // FormulaSym[0],FormulaSym[1], " s8 M, [+ @% M7 I // FormulaSym[2],FormulaSym[3]);" ?* \$ V9 b6 i! f. `9 e ShowFormula(FormulaNum,FormulaSym,num,sum); / T1 X' m( i. K N/ n result++; 9 z9 `5 w% e9 n! ^7 g) S, c S } / W; F) {2 h& m/ A: r- W8 o4 O " h1 W# P: s d5 d' `$ [& W1 V; X // 依次穷举操作数' r" m5 N- M: x2 W1 U 1 Z0 D/ A" E) O( w# k //允许数字重复的穷举 . i! I0 h! O3 n+ I; ^! F //FormulaNum[0]++;: _8 M9 f1 p' b. O //for(i=0;FormulaNum > max && i + \; g; N7 h/ F; D1 n$ ` //{ 6 q: U6 J9 D5 N& s // FormulaNum = min;- b- {" u4 d' U# A // FormulaNum[i+1]++; " m" u. _4 g. E$ n% u- N //} s9 n- x" h% [1 Y2 v // 操作数穷举与操作符号穷举联接* j% x! P& w, P. A, r# ?' ?6 J //if(FormulaNum[num-1] > max) . M* O! ?* |! I- K5 e7 L //{ 5 I. g T) Z ^3 i# @4 i // FormulaNum[num-1] = min; * S1 _) C; @- X, z // FormulaSym[0]++; ( |0 X" m8 `+ M; f9 { //} $ ]( n& F( G. R3 p f( Y; l ) Q$ M' |! B3 E" A // 不允许数字重复的穷举8 A9 [1 t, I) E2 l7 S Z% r // 数字必须从小到大的排列,防止重复, O$ U2 I( L# O' s. N2 r; Z if((max - min)< num) exit(0); // 出错; V! U; z4 k0 W6 N) b, G 7 U% B7 E6 `. k if(EnumArray(FormulaNum,min,max,num)): N/ @1 \( m& T {. P) b/ O: ?) k& W FormulaSym[0]++; * q, p3 { H; P1 O- J' d InitArray(FormulaNum,min,max,num);& y0 m J, _# A FormulaNum[num-1]++;; F/ l& x" J. j, S } Q( a. G8 H; w; M+ Q # W' B' f) M( \9 H+ z // 操作符号穷举0 r4 ^! `! I4 j for(i=0;FormulaSym > 4 && i" @2 Z* ^3 P8 j7 V* u {' ]- O) I* n! i/ A) @" T FormulaSym = 1; ) ~+ W) C4 I# T' t/ O FormulaSym[i+1]++; % v) h& E; O6 {5 }6 a }9 @: F+ x3 |3 T+ D$ \5 H4 [ ) @9 A; R: B9 [ } 6 T2 `, N5 n4 ]8 y: t3 ] //释放空间 / k4 f8 X' n! ^. C4 W free(FormulaNum);4 w: G( p |( J+ p free(FormulaSym);! z- ~5 Z" t) O) q2 e* R return result;; {. \( g& `8 d3 S } % N7 S; c( T) N$ P* y+ `' ^3 \: d // 计算算式结果 3 x0 n: x2 H! K4 m7 c: q double GetFormulaVal(int *Num,int *Sym,int count)# f# d& Z# L. Y: j+ R, ~ {7 P; a, v- R" T; o' m3 d3 n, G int i,j;" x' K( U/ x; S double preresult;1 k- Y* A& L0 Y& v( D" Y* T+ \7 c/ Z preresult = Num[0]; * I8 o3 I' _$ A% m8 t i=1;j=0;8 w" ?1 w) X/ U. H1 r x8 @5 a( u while(i/ n" S; \: h2 v, L { ; o4 }& [% ^$ f n# f1 H switch(Sym[j])% o! C" K9 V2 W( U+ S# V { $ ~( b3 g$ e0 w case 1: % ?6 c5 }5 E1 a2 n; g6 y preresult += Num; ! y3 V3 L- H0 L- T/ C break; # h1 F7 h3 U! k5 O* }' [ case 2:* V- ~% c$ J/ [4 B+ {' _ preresult -= Num; # q3 h! J. [* e0 N0 _9 V5 Y break;* k( `0 L- |( t1 ] i3 b5 X case 3: & o- x1 y. j2 ^ preresult *= Num; 4 `( s) _7 X) R; g! u% E break; ( x0 h; v1 ~( } case 4: `4 l' y6 N. }) B if(Num == 0) return -1000; 7 R }8 D' R5 x: T, k preresult /= Num; 9 C7 t5 s! ^& _: ~3 Z break; 7 V/ l* w6 H% R" j! L3 K+ B } ) w. }: O* f# ~0 i i++;j++; $ Q3 f1 t9 d+ U0 Y" w0 `- W0 j } 5 I9 ?, M$ c9 {3 B1 p5 U3 ] return preresult; //进行修正 9 D" I I J7 B$ k+ z: r, o } 8 J* {( D5 U( p) s G5 h // 打印算式 8 [# g8 @% G4 n4 n void ShowFormula(int *Num,int *Sym,int count,int sum)7 x, `& q% w4 z+ V l/ u( i { 3 f# N" X. T; r1 |# R - i4 g7 {) `; O2 L$ o int i,j,len;1 u) y! ^) K4 U char *Formula = (char*)calloc(count*4,sizeof(char)); & P2 l; Z3 ^6 h8 s- T2 C; q char temp[10];: I' T* d+ i6 i itoa(Num[0],Formula,10);9 j# O9 _" @/ A6 e! ^ i=1;j=0;7 I& g. G2 C4 z1 w1 \ while(i0 n: [* Z% Y4 w: \5 T) N { . L$ n1 T1 w8 S. g! k* ~- R5 |8 ^ itoa(Num,temp,10); 5 @; p; |+ h- n0 }+ D* w len = strlen(Formula); . v; y1 H5 X/ g0 N switch(Sym[j])' e" W: T- x3 P; [/ b2 P {2 k+ t+ k# C4 k2 I' U1 \ case 1: " n* I+ ?1 s. M4 G, x case 2:4 U5 f6 k3 v3 U Formula[len] = cSym[Sym[j]]; 4 t6 t/ V& m, ]. h' I! N/ |* [& F strcat(Formula,temp); $ _* {2 p) }% Z6 s break; 5 `& D# m$ T9 ^1 Y3 } case 3: ]" {* y$ p6 u5 N$ k G* h+ x2 m case 4:- M# D& u7 v7 P' q/ @, } * e) j) X5 K3 _) s# l$ |/ N( |) { // 如果上一个操作符号优先级低于当前的,应加上括号 X! ^5 k9 Z5 v0 \# E* m if(j==0 || Sym[j-1] > 2) u y$ J' r$ | {3 T2 Q/ i5 u$ m+ M0 a( Z Formula[len] = cSym[Sym[j]]; 7 i5 A7 N t; a/ d+ B strcat(Formula,temp);$ q( E" l: m+ m3 p" H1 [, w } 1 p E8 _4 a4 u4 o$ L5 J! ^ else 4 @0 I" D5 `0 X1 i {' f- n# X3 ~% S/ o- e0 X int n; 0 y4 w( |0 N# S8 ? char *FormulaTemp = (char*)calloc(len+1,sizeof(char)); : n9 p) {% F) T. r" x5 [, U. u for(n=0;n0 `! f+ u6 ~4 Z/ U2 {. e! I% ` { / s) y) W9 G. f3 `4 L& j FormulaTemp[n] = Formula[n];: l2 _& h5 ^1 }6 W3 U Formula[n] = 0;( T" |, [. y8 a0 ]) S } , t! S5 A, W8 L' s. c" Q' }; c7 M$ D+ e Formula[0] = '(';$ |' u- |" O' J9 X9 l/ ] strcat(Formula,FormulaTemp);1 L- L1 B; k9 a: t/ U free(FormulaTemp); % ]0 O0 s% K [+ u- H) [( j9 t" k Formula[len+1] =')';! T0 u! y, D5 ?9 s y( y3 \& V% q Formula[len+2] = cSym[Sym[j]];/ u9 e7 K7 |0 ] strcat(Formula,temp); . }" v$ d5 d, k+ b }! p2 K. ^0 R% G' S3 x0 g: Q' \ break;7 K4 D% w) ?/ ]% ] } 2 I j9 y8 a2 Z) k/ h) J i++;j++; 8 s H* ^0 J; b5 M" P' h }& n m2 B% W" O8 B printf("%s",Formula);9 h- k9 p$ o& i) h( L; ] printf("=%d\n",sum); 9 b: D% W7 Y- y! ?) K free(Formula); ( Q4 r1 `! w! [3 ~: V8 F* [ } 3 a; G) b* L( p9 y S, o* R $ |9 q) {" R9 f8 {9 m) G% s // 以当前数组为基础得到一个从小到大排列的数组 5 U7 [( l6 p& B. N- c // 返回非0表示穷举结束/ e) n! [3 [( h/ n7 @ int EnumArray(int *Num,int min,int max,int count) 9 D4 Y; m, G$ r5 n. o+ t ?! M { - n" z' ]5 l- f* s: |4 z int i,top;* n9 v, r* @3 d# C# b9 q top = count-1;; Q/ f2 B. ~, H# Q- { Num[top]++; ( x, Y) x- z& B( u while(Num[top]>max-count+top+1 && top>=0) 5 M+ P* {* c `7 W& I {0 T O+ j/ P4 A q- W! k top--;& ^4 }- A9 A7 N! w Num[top]++; % j1 s. s5 J% J8 J' y) y7 a F3 b }& r: J- t2 ~: T( J; q for(i=top+1;i( R* i1 Z+ x# ^; t4 Q, C* H { . E4 B) `5 @: v$ {2 O+ r; s; m Num = Num[i-1]+1;! r0 q# L- A! x9 u" p$ F- M- Z }# p0 x" @# j/ @7 h) @ if(Num[count-1] > max) return 1;& F. N! g. Y9 I else return 0; / ?( h$ a4 F4 Y+ q' m- J) n }4 E; C* k" q- z8 q& m 2 f3 b& @$ D! e- L( S/ u // 不允许重复的初始化数组 0 D* q6 h! r/ x1 i- b: y; R; [ void InitArray(int *Num,int min,int max,int count) ' ^( ?; M' Y0 Q) a9 K9 g { ) x1 U$ ~- C8 g: p) }8 O! ]( L# w& g int i; $ R5 l; n5 G; D7 U3 t9 @/ y4 c) { for(i=0;i=min+i;! K" `- p9 L6 ?* R9 k$ ~% w. u Num[count-1]--; 4 F) Z% b3 H5 q; j } 3 [0 N, b/ S- O & e( h) e, H5 q/ n$ x 5 M+ G v9 h$ f. n4 V2 G7 { 8 y: L" N1 Y- `/ I 1 S) K! T) w4 B3 @, | i
    [此贴子已经被作者于2004-5-2 14:50:47编辑过]
    , D3 k/ x+ M' Q! o ( Q* H3 W9 d5 A2 j1 {; N" c/ p4 kprintf("总计%d个式子\n",EnumFormula(1,10,4,24)); 的运行结果是: , J( o! M8 u$ X: i1+4+9+10=24& P8 t Q, E& O 1+5+8+10=240 G& e) X3 a3 l t$ u# s 1+6+7+10=24 q m, q* {+ F, b" E0 p& b 1+6+8+9=24 2 [0 V5 e; y7 j" ~* y' o2+3+9+10=24! w$ j0 A" J0 @5 D8 M 2+4+8+10=24, R8 H6 H6 u2 c 2+5+7+10=24 + W* m, @2 t& }8 x: X2+5+8+9=24 ' \, e7 t4 y, u2+6+7+9=24 3 ~* K9 T5 \1 u3 i3+4+7+10=24 , Y' I+ a1 e7 l1 M$ f3+4+8+9=24 ( ~! l9 k% y" O* n9 F/ I5 ?3+5+6+10=24 $ h$ `# g& X4 {5 [& T; d3+5+7+9=24; ~/ Y9 W3 w, ^& X7 v9 [ 3+6+7+8=24 $ Z" \# ]7 }" R/ o( I4+5+6+9=24 # V# L, }& \; M% H; \, {4+5+7+8=246 R. Z4 K# X; R3 L& F4 N 这是什么意思?似乎是找出了 1 至 10 之间的和是24 的数据,这和完成计算24点,差很多吧?8 `* z4 Z& V) E' e5 G 比如用户输入 2 ,5,7,8 程序应该能得到计算这四个数据得到24的表达式才行啊,这样就可以写一个游戏了。. B: u( l' }! a# l5 G) ] 如: 1,5,7,8 有如下方法可以算出 24 & R+ J, {" F3 R, m((1+7)-5)*8 = 24 2 L' W2 y0 }% ?7 V2 E$ g((7+1)-5)*8 = 24 p; R. Y% u6 K(1+7)*(8-5) = 24 2 Q q- K! ]* `5 T! J5 E(7+1)*(8-5) = 24 / @$ X+ L0 t; Z# I+ B0 j((1-5)+7)*8 = 24 & B- U2 D) G' N((7-5)+1)*8 = 24. a9 ^1 d7 P: w5 F) x (8-5)*(1+7) = 24 4 a% ?- }& ?; R" _# i$ |! C(8-5)*(7+1) = 24 3 e a' [; ^0 O8*(1+7-5) = 248 Q5 i8 ]) x% H' d 8*((1+7)-5) = 24: h& d6 _8 _& m- ?2 x0 H. D; @ 8*(1+(7-5)) = 240 O. b% s! {$ \. L 8*(7+1-5) = 24 + Y4 [; y* Y2 v8*((7+1)-5) = 245 _9 q4 C$ C; c4 J# v 8*(7+(1-5)) = 241 P' [' w. k+ c( L! o# m, ? 8*(1-5+7) = 24; W q3 z3 E0 u8 N J 8*((1-5)+7) = 24 ; Y* Z! s- D- s8 r; j- p8*(7-5+1) = 24 3 _! w* f% H" ]8*((7-5)+1) = 24 : m5 ` P5 m, [$ q7 Q

    该用户从未签到

    13
    发表于 2004-5-2 15:21:00 | 只看该作者
    结果是这样的:
    ( [! O% `& H0 ^$ w, G9 a0 k1+4+9+10=24+ m2 Y# ?: n" {
    1+5+8+10=24
    : g+ f! K1 z+ ]. K2 z: x1+6+7+10=24& g: B. _3 r$ S  a$ }; b
    1+6+8+9=24
    $ o0 u; t; s( S5 |/ g4 L" I/ j2+3+9+10=24
    ) X6 g4 S# G, o9 i2+4+8+10=24* E( I- t8 N/ q/ F
    2+5+7+10=24
    ! i1 ~' g0 G4 I4 l+ k1 ]) [9 C$ w+ f2+5+8+9=24& F8 f3 d( Q. G5 F0 o
    2+6+7+9=24, x  y# k0 G' K% G! u+ h
    3+4+7+10=24
    + o/ r2 T) R7 z' q% ~$ x3+4+8+9=24
    " |9 u( {$ M7 [& f) u3+5+6+10=24* |) }1 l3 g9 O+ I7 g6 o7 @7 ?
    3+5+7+9=243 |% [* Y1 j* x; S- @
    3+6+7+8=241 I5 }+ J: M) M" ~+ `4 x0 u5 U
    4+5+6+9=24
    , K" p4 c5 V% Q4+5+7+8=24( ~0 a' s5 v. h1 [1 _( L- J3 o. {7 z
    1*5+9+10=24; a/ N  @. @0 j1 @% P
    1*6+8+10=24( x1 r$ d( G; Y6 _' z2 r; g0 K
    1*7+8+9=24
    0 M% S& B  E& C8 ~1 i4 m5 A2*3+8+10=247 b$ f. e+ y" M  y7 t" {1 p
    2*4+6+10=24! U4 o8 E+ U/ u% Y; v5 |
    2*4+7+9=24
    5 g$ m; m8 ^% E# T) k2*5+6+8=24
    6 `7 t; b2 m/ \- @9 R3*4+5+7=24
      k0 D6 q$ U2 Z4*5-6+10=24
    , T  Q0 g) x* n, H# }* q(1+2)*5+9=24
    & ]( `7 D% I. P7 D(1+3)*4+8=24
    / E3 L3 U- F& {+ L1*2*7+10=24. O/ F- k3 n$ u- s! E0 C' @& s! m
    1*3*5+9=24$ _' d- u4 x) p1 E+ {9 `
    6*7-8-10=24
    * ]% F; M7 P' Y! @(2+4)*5-6=244 D  L# G' c# N5 F
    2*3*5-6=24
    % h) A6 ?9 {- f(1+2+3)*4=24$ r% x' A1 \- f
    (1-2+4)*8=24
    * R6 w' S$ a  Y- X# ]; Q9 r: m+ b(1-2+5)*6=24
    9 e2 h: e7 s; a" r, L* W, D(1-3+5)*8=24
    ' m" J  ?: M) n" a(1-4+6)*8=24: I- M) \9 _$ T3 v! m) H
    (1-5+7)*8=24
    $ d' v* F" [( K$ B! w1 h(2-3+4)*8=24
    7 R: t4 j7 X* }/ w% f! B(2-3+5)*6=24
    $ A) \' }7 g7 B+ S2 `(2-4+5)*8=24
    & M% h2 A  ~4 B0 @(2-5+6)*8=24( h0 x) e* O- P
    (2-6+7)*8=24
    0 `7 A( f1 S$ z(3-4+5)*6=24/ x; g$ C& d& ?  f
    (4+5-6)*8=24
    4 P8 v0 R7 ?! [1 z2 e(4+6-7)*8=24
    ( O5 ]+ Y9 l  _  x  {1 {6 P(2*4-5)*8=24' Z8 J: b6 h. t6 @" @3 n+ T
    (2*5-7)*8=24- _0 y' F0 G( U  X7 N2 k
    1*2*3*4=24
    : k  j' R& r) B) U1/2*6*8=24
    6 k+ l( k6 P. m. C2 `. I; o3 U1/3*8*9=248 Q: Q5 k7 g* H5 ^; Z
    2/3*4*9=244 ~# [) a8 c$ V) I$ G8 n
    2/4*6*8=24, k7 }& V" ^, {% m0 U" H6 j2 Z2 y! H
    2/5*6*10=249 y, y2 k, ?( A
    2/6*8*9=24
    3 l! O1 _# \5 U6 e; Y3 S+ [3*4/5*10=243 P$ Q7 A& `+ h, Y+ l
    5*6*8/10=24
    : l' V# o0 R# F! O2 N  s" c$ {总计57个式子

    该用户从未签到

    14
    发表于 2004-5-2 15:22:00 | 只看该作者
    当然不会只考虑加法的情况,大概你复制的时候出现问题了,你可以下载这页最上面的那个程序4 ~+ r% S" Y0 `6 E$ D0 I
  • TA的每日心情
    奋斗
    2015-9-17 00:58
  • 签到天数: 1 天

    [LV.1]初来乍到

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

    [LV.1]初来乍到

    16
    发表于 2004-5-2 15:28:00 | 只看该作者
    (2-1)*3*8 这个算式你就没有啊,这4个数字的组合都没有出现
    & W4 G9 l2 y  q( f" n4 d
    - b- m" Y- a7 S0 n* `( }
    4 l3 @/ C# p- A7 P) T3 G! x$ X2 d8 C! l  t* p& J0 V

    9 e7 C* J% d: \* w) ]  m  w; O  g& ~. [1 E& \# ~9 v) E1 |
    : u0 j& m; k2 x9 h" d
    [此贴子已经被作者于2004-5-2 15:32:12编辑过]

    8 Y4 D; Q9 n2 f- X$ d( Z  ?& ^; X
  • 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 ], Y6 ?/ i, u: w: y' B, ]9 c2 ]( m( w- w: t
    用这个好了,只不过输入的时候要按从小到大4 \& E/ W, q# z. B+ ]

    % G. P+ T$ j8 B好象有BUG,我暂时不太清楚

    该用户从未签到

    20
    发表于 2004-5-2 15:38:00 | 只看该作者
    以下是引用yzhlinux在2004-5-2 15:28:15的发言:7 T5 ]5 Y+ }  s+ K8 M
    (2-1)*3*8 这个算式你就没有啊,这4个数字的组合都没有出现
    2 F1 q$ r+ G+ n3 D

    " O' Y; l' b! j7 e: c/ J3 i& N本来为了防止诸如! @% u) s$ k( @
    1*2*3*48 a6 e( g" _7 }
    1*3*4*2
    1 @. H# J- Z, ?$ E" L- X, g2*3*4*1  G+ T: |. W8 \  J! S8 A
    等的重复,只使用了从小到大的数组,不过这样好象也丢了不少可行的式子! J5 c, l3 ?& T! H) _' |3 i

    1 L0 O6 J# O$ q- }  N8 ~- e% ]# E4 X另外你的程序就是有这些重复的
    1 n) f6 `0 u! R/ l! K  R$ U6 h3 Q9 _! k/ P4 a% r- D
    PS:VB的程序感觉就是慢好多啊
    4 m2 E9 Q9 d9 R
    [此贴子已经被作者于2004-5-2 15:42:01编辑过]
    , H% }2 U% @! V) Y4 \9 B6 }& c

    本版积分规则

    关闭

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

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