下沙论坛

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

QQ登录

QQ登录

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

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

[复制链接]

该用户从未签到

跳转到指定楼层
1
发表于 2004-4-27 17:53:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
就是扑克里的24点游戏,4个数,+-*/得24……- N/ l2 f$ \4 _$ h& P

# f" f0 G9 Y* u偶还在想……
分享到:  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的发言:
    % c  o" F) f8 [7 ^, Y3 @0 o穷举法吧
    2 _; B2 Z" A0 H# G/ U, R: v1 `" t
    那你的代码要写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 则表达试就是我们要求的了。比如:
    ! A  q+ o0 n" |3 M! Efunction GetMach(A,B,C,D) as String       '得到一个字符串组合如:(A+B*D)-C
    % i( C2 m' ]5 a7 `. Q4 lfunction GetValue(MachString) as Float    '得到字符串的计算值 ,可能是小数
    7 \" f2 Q) K) a: n4 a那么程序就好写了:
    # t9 {) l! x6 ^2 Z! jGetNumber(&A,&B,&C,&D) ;    '得到ABCD则四个数字,赋给A,B,C,D四个变量
    3 }! G) F/ A5 M+ o4 m% B5 |. s! A# ddo{
    $ A+ K% d/ S) v7 X8 E! j: `  MachString = GetMach(A,B,C,D); '得到一个表达试的字符传
    : ^9 I. s. q: x+ H, r  if(GetValue(MachString)==24) break;
    / G$ E2 b- Y/ ?% }}
    ! ^# Z( N* T1 Y. |9 ~! I& xprint XXXXXX;
    1 k6 [  L9 G3 v$ a/ `

    该用户从未签到

    7
    发表于 2004-5-2 11:57:00 | 只看该作者
    我现在试着在写,就是不知道有什么好办法解决重复的算式问题,比如
    * s: E) Y7 M! B' u(5-2)*8*1
    * w' V  w: x) E8 Y7 y. o* Z" Q1 ?
    (5-2)*1*8   k& |; D% \6 h0 G6 N  R  }
    8*(5-2)*1
    6 m0 @/ n1 t1 l9 D. i等等
  • TA的每日心情
    奋斗
    2015-9-17 00:58
  • 签到天数: 1 天

    [LV.1]初来乍到

    8
    发表于 2004-5-2 13:17:00 | 只看该作者
    ( @" [' h' ]$ }$ y. X7 P

    " j& D0 l: f, u" }: p$ m- E花了一个上午,终于完成了, ~  c, ?. R. p1 U/ l
    你参考参考吧,哈哈
    / d) @0 y; k' Q6 V" N: P5 C9 j2 {0 |( G3 M: F) M

    / ?2 q* y1 k( d0 X8 U$ i
    [此贴子已经被作者于2004-5-2 13:43:13编辑过]
    9 D5 ?3 x1 g) V' x) ~
  • TA的每日心情
    奋斗
    2015-9-17 00:58
  • 签到天数: 1 天

    [LV.1]初来乍到

    9
    发表于 2004-5-2 13:42:00 | 只看该作者
    上面的发现有一点bug,
    % I6 e2 h1 K1 k' J, T0 F# v! E这个改过了1 n: g0 c( g& V6 S" D
    一个计算 24 点的小游戏
    * ]0 M3 H1 m/ _  U, sVB 编写' S& Q/ G1 n/ C" \' O
    : c* n: _& ]! D# e) b  `1 k) F

    $ o2 H# G# I3 t8 C# M- R6 b) Q
    [此贴子已经被作者于2004-5-2 15:17:46编辑过]

    6 F0 Y( X' V. K( z* x

    该用户从未签到

    10
    发表于 2004-5-2 14:41:00 | 只看该作者
    #include $ a6 r9 P- O# H#include ' a6 a4 N$ r* t7 [+ A$ U% T8 g6 G' g* p int EnumFormula(int min,int max,int num,int sum);, O- O8 r, B) V2 {9 M8 C* A% i8 i void ShowFormula(int *Num,int *Sym,int count,int sum); 6 ^2 U* Z* L! a" ^3 ~) j7 I& [, Idouble GetFormulaVal(int *Num,int *Sym,int count);. E5 I% S1 `5 [8 z/ `5 }3 Q int EnumArray(int *Num,int min,int max,int count); % `1 E, \* ^7 D( x, s2 u# x0 Ovoid InitArray(int *Num,int min,int max,int count); 4 Z Z. L" b% o1 l) l& `% bconst char cSym[5] = {0,'+','-','*','/'};5 j. s& g5 A! U; g- u t' ^ , }% _* o5 a5 z: I& h' F9 Tint main(int argc, char *argv[]) 1 M+ o" Y+ ?) A* b! X$ l6 Q! }1 S# O{( Z3 s. Y4 U5 `% n, _5 W5 Q, [ printf("总计%d个式子\n",EnumFormula(1,10,4,24));8 q% Q9 e0 z0 ]3 k system("PAUSE"); x5 n2 [3 Y V. _: X) T return 0; ( ~, i0 D) `: p) l9 E+ l. Y& U} 8 t& P4 O! L: S5 s& |% R: f: Z3 s% j- U2 g+ p% G9 Q int EnumFormula(int min,int max,int num,int sum)( ?' ~; n, U" [" s# k% j {7 c$ R5 c: I D- s int *FormulaNum = (int*)calloc(num,sizeof(int)); //储存操作数 3 [7 ^/ V9 C1 O M" |8 @+ b //储存操作符号 % r1 s8 v& x. }% q3 } //最后一位用于穷举结束标记 * }5 ?, v/ i- A( H // 1 - 4 代表 '+' '-' '*' '/' ( M% ~# k, u( k7 f int *FormulaSym = (int*)calloc(num,sizeof(int));. \7 ~% Q+ A9 C: P5 K4 B0 ~ 6 c0 Q7 g5 r: P& }. M int result = 0; 7 y1 |, [! L0 I/ o // 初始化操作数和操作符号数组 4 D$ C) z9 {, ]0 o+ f4 { 5 U1 S4 W9 U1 w& l8 V" A int i; - |+ S" D) n; J# u; A3 t: J( H: T6 n! L6 F for(i=0;i = min; ; i [ L4 n* M" K2 Y, q1 t for(i=0;i = 1; 7 @% I( [, r. |+ L }$ P FormulaNum[0]--; 5 Z5 o; t( s) p5 X7 C/ B7 @6 \5 T- x1 R# g( [ InitArray(FormulaNum,min,max,num); ( ]0 {! t1 D4 L- m, N- w; F( b5 g: j FormulaNum[num-1]++; : S( a. ^5 a' a y* S, B // 穷举操作数和操作符号组合1 e {& V) J1 V2 y$ N# ] while(FormulaSym[num-1] == 1)& ~3 d3 Q" {6 c# l {, j8 i' G, l* K/ J9 x& x double t = GetFormulaVal(FormulaNum,FormulaSym,num) - sum; 7 m+ H( ]% ^$ E. n2 ? if(t>-0.01 && t<0.01) 0 v+ _+ V; @' u' j# C" m! i$ b5 C { 5 n% ^3 B0 j) W- f! @7 S //printf("%d %d %d %d | %d %d %d ",FormulaNum[0],FormulaNum[1],, }! p8 N3 r9 T( `# z+ } //FormulaNum[2],FormulaNum[3], - D8 u5 u; ?, t. E // FormulaSym[0],FormulaSym[1], * P A% X S+ S9 k" o. `- }0 ]/ c" q // FormulaSym[2],FormulaSym[3]); 1 c- K9 L& A5 R- e ShowFormula(FormulaNum,FormulaSym,num,sum); 1 v% e Q4 H& k7 D% Z result++; r3 K9 p0 I( A2 @' f- F } 9 L- }: M0 u( G% w/ O9 h * \- V% @4 E1 z // 依次穷举操作数 6 ^4 M3 s9 [/ n# E# i% ]6 B6 m7 t 9 n8 a/ j# a% N& b( N( s: J9 g //允许数字重复的穷举1 l2 A( N% X4 \8 e0 G //FormulaNum[0]++;% P: p6 w0 B7 j( C: }* N+ o //for(i=0;FormulaNum > max && i 4 G/ w) B5 v2 t1 L+ D) j! E* M g //{! E- C7 T o3 U+ Z // FormulaNum = min; $ _+ I; y. i" U+ N y: s // FormulaNum[i+1]++; 5 v* R z% S' [7 ^ Q$ t //}+ c9 l- X: `* Q: U: T4 j$ d // 操作数穷举与操作符号穷举联接# X0 H3 X9 @" k0 f //if(FormulaNum[num-1] > max) ) z( p; {! r, w //{ : V o: c/ s& l // FormulaNum[num-1] = min; 4 X, s' o$ }% w! Y) T* s1 ^5 D // FormulaSym[0]++; 2 ]; r) z1 s1 f' o4 ]( a0 h# j //} ) z" b; o1 H6 d$ ]; h 8 w) K' |8 B; K% d) H$ `' Z // 不允许数字重复的穷举( i! G, r5 L6 I. v' {& W // 数字必须从小到大的排列,防止重复 2 ~( n1 I, ?) r0 ^ if((max - min)< num) exit(0); // 出错 5 m1 P5 F. V) G! `8 b+ [. d u" \. B if(EnumArray(FormulaNum,min,max,num)), C$ o! h1 U) e {) e& N7 X+ v5 ^ FormulaSym[0]++; `. \- I; K/ a InitArray(FormulaNum,min,max,num);9 ~5 I- Z& N2 ^5 S8 x. T3 L FormulaNum[num-1]++; 4 I3 Y% |7 H/ G2 |( s+ W } i4 E4 } F) C/ B ' g8 |. l% Z, d // 操作符号穷举 : l( ~% ?+ h* A4 R1 V |7 f% c for(i=0;FormulaSym > 4 && i8 {, g6 x- K; b/ g, k { 6 e4 T8 ?2 F% A9 W2 L FormulaSym = 1;( I/ ~1 ?' ?1 [7 W) i/ S FormulaSym[i+1]++;2 a( k$ Q0 V" H( n; e6 {9 H }6 y5 ]- Y2 D- ~- f- b ! A$ [# m7 b& ^& o9 t1 m, l; X. d }6 s/ b! w L3 H4 s9 `3 u( L //释放空间 1 p; d7 V! M2 `# X free(FormulaNum);. R! U0 a$ v3 r+ Q' E( @8 W free(FormulaSym); * g& R. v( \9 K' S2 t8 T- x. S3 h return result; - v: e& ~7 I- C} 0 B6 |/ Z' x5 m( R2 O0 ]1 B// 计算算式结果% E: N1 b0 f2 O" X double GetFormulaVal(int *Num,int *Sym,int count) - d2 s; O5 H( H: a{- ^: a# ]- {+ Q' E* u; r0 _ int i,j; & @* }+ c: r& \ double preresult;- O8 A/ y8 a$ H% H; y& ~' W2 o# y) a preresult = Num[0];& e( |' X" g3 p4 U$ E i=1;j=0;# e* u% \; Z- d2 ^ while(i0 H, N. N# e1 N {2 P, u* X g- h% b switch(Sym[j]) $ v: r8 h0 [* i5 P. T2 h4 I { 4 V v+ U6 t! L( _. ]7 w( Q case 1:6 M5 X0 E4 ^7 d4 { preresult += Num;/ L' g% W v+ W7 H* e break;* D0 ?: q, s. Y/ D! E3 W4 L case 2:3 M) A" D$ n; R( Z preresult -= Num; * \+ m: o: y$ k1 R0 y/ P9 H7 B break;, \% n: U* z/ c case 3: ' S7 P9 c4 ]& m3 l1 Z preresult *= Num;# M5 T" T9 T3 `: \ break;8 l/ P; }4 J7 ` b case 4:, V5 l/ M3 ~) ?4 q1 E6 A if(Num == 0) return -1000; 6 N) c" \! c; M preresult /= Num;2 d1 j N1 h. f9 e6 t0 T break;# ^/ Z3 |; r8 j# X7 J } ; p1 s( [) Q K i++;j++; $ u. }# [2 x2 o# _% p& d4 @ } 2 W+ o; C2 ~% G' M; ~% H return preresult; //进行修正 ( B" R: d* k% |} 2 I( h) b0 X4 V( f// 打印算式 $ U8 `: Q! `# T7 U' |) K. uvoid ShowFormula(int *Num,int *Sym,int count,int sum)1 H3 n7 v9 a5 c0 t0 D { 2 q3 B1 P5 g7 v) P. [2 B ' G0 s1 k o: b6 ~" M( n int i,j,len; " T$ w( p3 }! }4 F1 ]# a. C; w' u char *Formula = (char*)calloc(count*4,sizeof(char)); 2 F0 d; a, p6 M3 v; ~ char temp[10]; * X- r5 z0 a& I( ^7 J- a* } itoa(Num[0],Formula,10);; @6 |2 o, t% p0 y; V0 Y6 C) t i=1;j=0; ; ]2 w* n6 p- r2 o. U while(i) L7 u6 Q9 M- O/ h- T4 b1 H6 v { b) {: B% ?5 v itoa(Num,temp,10); ! T+ E, c+ k3 [1 g4 f len = strlen(Formula); ) t$ _- z' t0 Q; r% s switch(Sym[j]): A, ]1 ~9 C# ^ {% Y) F& `, p; c case 1: " r& s1 Z1 H9 [: X1 \3 r6 @ case 2:3 S( @8 ~- g$ H- j+ b! _# G- W Formula[len] = cSym[Sym[j]];- x/ S' C2 i/ C* o8 M# W strcat(Formula,temp);! o, o2 o% V. L* b1 q% m: I8 u break; 8 G' u! H& i7 k8 R8 S case 3: 2 S9 e; c O4 L: z2 D case 4: & g, v' m- p4 k$ r7 s, y / J3 x# C2 g% S7 h. l% d // 如果上一个操作符号优先级低于当前的,应加上括号6 D9 Y6 m( ?* s$ X' B' M6 j if(j==0 || Sym[j-1] > 2) ) m) r Q7 S8 `- |4 Z% R6 | {" q8 r1 p- M# b Formula[len] = cSym[Sym[j]];. K8 J! |7 N9 ~% ^ S strcat(Formula,temp);4 |0 ]: {! o. A$ Z' T }) @4 l3 x( S( {+ o: _ else 2 V. |2 x, _) I; v+ f+ ^ {9 R, r9 ~0 s! g" ]6 p- W int n; }7 b' g6 X2 R3 N8 U, d char *FormulaTemp = (char*)calloc(len+1,sizeof(char));9 j& j% R1 t! y/ j" D5 `& r" D* ] for(n=0;n& t8 K) S* i: P1 n% x { 6 G- `1 s6 I: \' w FormulaTemp[n] = Formula[n]; 4 |; f- {* B$ w' ]5 B t4 ? Formula[n] = 0; 7 L( C. `/ V3 ^6 T% U3 J4 h }! a9 w- e/ u# ^; o C" d Formula[0] = '(';4 z# g5 c% L$ ^( B strcat(Formula,FormulaTemp);- l( `# A6 K7 b# L! G7 J* H$ b free(FormulaTemp); 8 b# X6 n0 `' d7 [8 [. Q$ ` Formula[len+1] =')'; ; U& l5 S) ?5 c: E7 \ Formula[len+2] = cSym[Sym[j]]; 4 h1 _6 X; }1 j4 v# j( r strcat(Formula,temp);* F; O2 K, M/ s/ { }1 t( O; r+ w- I break; + O, R' |% Z/ T. L } 0 f8 J0 h! \& F$ u* L6 J- e3 s i++;j++; ! s& I% ]+ X5 p+ V# n+ ], `# O } 7 ]' `5 G4 N* ]. k% N& d% m printf("%s",Formula);+ b+ h$ I; k/ T; ?; k2 ^7 t' M printf("=%d\n",sum); & j" d. C# {8 X# K8 h free(Formula);% W) ?& J+ B5 T9 ? U4 D }& d5 | M& W B1 r3 p8 ^$ G! I% m6 O 9 j& p" f6 K% O3 E0 u // 以当前数组为基础得到一个从小到大排列的数组6 i3 ~7 ]6 Q5 @/ \/ x // 返回非0表示穷举结束$ R. e Q. g4 F: Y; t int EnumArray(int *Num,int min,int max,int count) 0 O1 ]! }8 L2 N t4 h/ K7 l% Z& F{ 1 A# |8 D% B0 o3 Z int i,top; * _2 f( o1 m6 w1 h5 i+ t top = count-1;6 m: a5 r' Z- @" K Num[top]++; & n- g" d! s) W8 U @, R while(Num[top]>max-count+top+1 && top>=0)# `! ^$ L* B- t; o, \$ t8 l { 7 M; Y# C9 }, u top--; : M8 p- K. T( z* p2 j4 Z Num[top]++; $ S, b6 I; z7 v- L& R* _ }" ?$ d# A9 }! U for(i=top+1;i0 K6 D& t' ?. H6 G { 3 M3 b: M; L5 c" I4 U/ u1 z Num = Num[i-1]+1; 3 R! k4 \; `5 G! B, _ }( r. g0 e6 r6 [3 N, z if(Num[count-1] > max) return 1; . c" {* U/ E( B7 Q7 ^ else return 0;% P5 A+ ]3 q) o! ^& t4 N6 T# V }% U0 _. E: |# ]. X8 H+ Z 6 {& U8 p# T1 K- T9 Z1 l// 不允许重复的初始化数组) p/ @, V8 M0 K, a- r# M void InitArray(int *Num,int min,int max,int count)' L0 g9 x5 H4 N, Z { 0 T h: r% q M. l2 Z6 M4 B8 _8 M; B int i; 9 {/ B( S1 W! t, O' i0 b for(i=0;i=min+i; 6 V1 a" _$ ]. H$ a \2 Z Num[count-1]--; ( `/ h0 Y6 x: v} & ^6 E4 p; ~. Y3 i% w. k: Q+ f6 C 2 k& I7 L3 z! ~ 1 V8 u3 R3 z: D, o; Z) k . ?: i( [' {. x" r
    [此贴子已经被作者于2004-5-2 14:50:47编辑过]
    7 I G* K: L* f" ~

    该用户从未签到

    11
    发表于 2004-5-2 14:54:00 | 只看该作者
    本法穷举出所有用min - max之间的num个数组成算式,结果为sum的情况9 m$ i: @# H( m# u( ^( \

    ! x! g6 p( G6 A: @4 J6 [$ W0 q- E如要具体的话,可以不穷举操作数,直接输入操作数,进行操作符号穷举
  • TA的每日心情
    奋斗
    2015-9-17 00:58
  • 签到天数: 1 天

    [LV.1]初来乍到

    12
    发表于 2004-5-2 15:17:00 | 只看该作者
    以下是引用游侠无极限在2004-5-2 14:41:26的发言: l# h6 e9 Q/ A) x#include & s; F+ }0 ^4 l7 ]- H #include ' A- ?( v& Q- `6 w0 L) [' N " {( l2 D/ b7 N3 G) X int EnumFormula(int min,int max,int num,int sum);! D$ f* ~; p8 v- c( R! w void ShowFormula(int *Num,int *Sym,int count,int sum);9 H$ Q# y) v: `8 \1 |9 P. h" u: o double GetFormulaVal(int *Num,int *Sym,int count); . d0 A3 @7 a. | int EnumArray(int *Num,int min,int max,int count); " w; k1 ~: l& T6 S void InitArray(int *Num,int min,int max,int count);& Q K% }+ N0 Z3 N const char cSym[5] = {0,'+','-','*','/'}; ~* w5 w* e& L7 C 1 Z8 c% G. n6 P+ s int main(int argc, char *argv[]) 9 I2 T+ x4 y+ }2 z { & j i3 }" M8 d2 x3 I/ C* y9 x printf("总计%d个式子\n",EnumFormula(1,10,4,24)); 7 {& f: e/ w0 @1 J system("AUSE"); % k! D8 a0 H7 [. }8 t return 0; 2 [: Q3 [, j4 v( J2 V3 H6 y }9 z& Z* j* W6 m8 D1 K9 z) v5 x % u& }; j+ @; H% p. g- ]3 j int EnumFormula(int min,int max,int num,int sum) s6 P* h* D3 b, _2 q {8 a1 j; @0 t* n- _$ @% Z int *FormulaNum = (int*)calloc(num,sizeof(int)); //储存操作数( Z, `9 G* n: X! H3 S //储存操作符号+ [1 X8 s a" g* B; b //最后一位用于穷举结束标记 - n: ]* b/ |% [5 h3 H // 1 - 4 代表 '+' '-' '*' '/'& l' f. y% j; ^' P/ @/ i int *FormulaSym = (int*)calloc(num,sizeof(int)); 2 |' @3 c( G5 M& G* D 7 l" [6 _5 q+ L0 C int result = 0; / \- Q. M1 f7 X4 C" w/ `8 ~ // 初始化操作数和操作符号数组 ! j0 o$ ~# L& \ 9 T- V7 [1 ^0 B4 L, y, q int i; . t c" D% |/ g9 c" o1 t- e: U9 u2 W0 _* E for(i=0;i = min; ( p" W2 } t% V. i for(i=0;i = 1;1 Y F% b6 f7 w2 f, ~8 Q& I$ y FormulaNum[0]--; ( U. T( |* [1 S H . ?9 H, h* `1 E* H, ^/ |6 y4 L8 T InitArray(FormulaNum,min,max,num); 9 i4 f7 d$ W: C! C. ] x FormulaNum[num-1]++; 0 Z: S/ B/ Q( J/ U; l& L _( M% F // 穷举操作数和操作符号组合 , W8 D# W9 ~# K+ Q" c while(FormulaSym[num-1] == 1)4 O3 I) P4 ?1 A( ~: S5 m { " d$ Y! \) k: k4 |. e p0 ^ double t = GetFormulaVal(FormulaNum,FormulaSym,num) - sum; % O7 J, W1 M. C* Y, W if(t>-0.01 && t<0.01) % z2 u. U$ b4 H/ [ { & h; D% p3 S, |: |# K5 C# r( C //printf("%d %d %d %d | %d %d %d ",FormulaNum[0],FormulaNum[1], , a/ t* c- S+ S+ o- j% o; {0 n2 q //FormulaNum[2],FormulaNum[3],1 u2 }% G. V/ A {0 n6 l; X0 j // FormulaSym[0],FormulaSym[1], . H& J! B+ P9 q. |& l: c' n // FormulaSym[2],FormulaSym[3]);+ \! ^% w2 O1 n0 r: P ShowFormula(FormulaNum,FormulaSym,num,sum); 3 w. X8 @9 v& |. U result++;0 Z1 Q/ B8 S* c }4 v$ C8 L6 f- G3 E3 p7 L / T8 e1 O3 R5 g+ M7 x& ` // 依次穷举操作数 9 y, F U3 x1 b ) a/ x0 a8 N5 G) `" g* v //允许数字重复的穷举 6 }1 {( r. H& K3 t) ]* b8 d" ~& t //FormulaNum[0]++;8 T- l, l) v. P8 M& {, E6 x# N //for(i=0;FormulaNum > max && i) H: u* G; s6 l( | //{ # e! e$ T, w; W; Q/ _ // FormulaNum = min; ! |: {" E/ |# o$ {8 o- _6 Y9 z // FormulaNum[i+1]++; + s8 r7 t1 W; @" J3 r v //} $ _; N& v M2 N, h( \; E // 操作数穷举与操作符号穷举联接 " j. p: X* j- a" N7 G //if(FormulaNum[num-1] > max)- S) K$ D: l" i0 n* h //{. B# K. h$ ^, o // FormulaNum[num-1] = min; a3 G' ^% G m/ l" G3 A; G // FormulaSym[0]++; 2 _ y& j% \; c" h" Q3 q: v+ i7 [ //}+ q9 M% Y1 T9 [ 2 R+ L( C V1 B5 J6 Z; G# e // 不允许数字重复的穷举2 {7 l3 d# N6 u: e0 ~ // 数字必须从小到大的排列,防止重复 : b1 P1 n6 V5 h4 z. `# t' \9 s" V( h if((max - min)< num) exit(0); // 出错 1 J- a3 J0 M/ v " @1 Z) w4 P# U; l if(EnumArray(FormulaNum,min,max,num)) : ^5 D0 l( N5 o# C {5 L; [# q! ]+ j9 K FormulaSym[0]++;" Y# V- Z4 b+ s3 L InitArray(FormulaNum,min,max,num); 3 K/ ~& R, K: i: o- v5 l* |( w FormulaNum[num-1]++; 2 C" z1 D3 z9 H) X } % [; M" K# y k ) l: d; E! K$ a' m3 N6 b // 操作符号穷举6 U6 u) O3 U: X, s1 _: |7 r- a; o for(i=0;FormulaSym > 4 && i, K* X2 y! w; q/ B) q$ W6 U+ N- v- n+ { {! Z9 G0 g% t; A FormulaSym = 1; 9 c7 Q. s, d' i FormulaSym[i+1]++; + s8 Z0 i8 _2 p$ ]. F' @ } ( B [: P _! F & p B: U5 F1 Z2 ?& {+ W) `$ l } 1 r, o x8 O @! S: [ E //释放空间 , t) `; D! P" u0 R4 v free(FormulaNum); & g( `! y, G* h, h2 e( a/ V4 h free(FormulaSym);; x9 Y8 l. D" X) x' ]7 l$ H return result; $ P; R" w+ }4 K7 k4 I }: [- [: M0 K" T' U1 c4 T2 I // 计算算式结果 2 C/ j* _0 `5 o$ |9 ?) R double GetFormulaVal(int *Num,int *Sym,int count) f8 Q1 W' l0 G+ O8 ~2 @ { 1 Z# ^! B7 @0 e7 \ int i,j;% X: ]2 p7 C/ ^. Y double preresult; * o) V" u- [" N* k1 O% I+ w preresult = Num[0]; , S7 Q8 d! R. [ i=1;j=0; & `3 O b d; b$ F" d5 x; ^* H+ L while(i) s5 M9 w7 \2 t, q: g5 H7 s {& H$ p7 s( z! ?; Z6 R switch(Sym[j])5 R" K: N" D8 g* b# T. ~% z3 ~ { 6 V$ k F' J. Y# |9 R2 k* m* c case 1: + U5 K. T+ E9 ~1 K( j preresult += Num;& j) p$ z" m ~* K Z' I' J break;; N. N, C2 V- Z- e- U8 } case 2: 9 d. O2 F$ Y2 a v( Y preresult -= Num;6 a* f! _) W0 O& {7 ?* ?( c6 d break; # U$ z8 _0 @2 r! J) l! z z' o case 3:& n# w( u# I$ S8 r" G9 P; Q9 A& ?( ] preresult *= Num; + S' L: X4 o" s2 K0 K break; $ L6 F) v: Z( U/ a case 4: ' l1 ]; Y f$ U# c3 b+ F1 k if(Num == 0) return -1000;7 F2 ~* I( b7 y4 V preresult /= Num; & L! z4 R |5 Y F3 j$ L break;6 a3 J. P- U0 [# \! v } e0 ~! V% E5 A1 F: p i++;j++; % T/ O. {3 M& d' S3 J } p9 l0 @& N. p5 V4 c4 K6 k: E return preresult; //进行修正% L3 g/ Q6 k# ]+ ~0 n! C2 G } 6 [! v% {0 Q) E: h( q3 n; \5 R // 打印算式( }* w( ?: q; l3 [9 U3 T- a, u" U void ShowFormula(int *Num,int *Sym,int count,int sum) # p: S# K: i6 g9 ~, B { - ?9 G- b N8 ?+ e . _: D r+ U& P/ d int i,j,len;# z8 S0 ^( _, D/ E- {- M char *Formula = (char*)calloc(count*4,sizeof(char)); 9 Y: [9 e! |4 Q. W; I q+ L char temp[10];& Z8 M3 {$ l6 Q$ R% H. V8 } itoa(Num[0],Formula,10);5 ~+ |) c: | D. W3 J4 i7 {) t i=1;j=0; 1 L8 t8 W, M" ]7 U" D: j while(i* \9 r/ p" C. f3 r. Z4 K { 6 ^* S8 y4 `9 ^$ f itoa(Num,temp,10);& M" d, {/ G4 T( \9 T% S1 M len = strlen(Formula); ( S. U! P5 b0 S% `% D9 X/ b7 ]) { switch(Sym[j])! Y/ I+ l9 p) \/ g& j+ J% ` { ! c+ F* }! @* M7 I$ [ case 1: 0 ^5 L& S% B, e5 z8 R case 2:' L& m$ n7 P6 B Formula[len] = cSym[Sym[j]];1 j0 v3 n' `3 r% i, @2 ~ strcat(Formula,temp); 3 W( T* E. j- {# n* l0 q6 s6 g break; , h3 s- @4 f; H7 l* \ case 3:2 ]/ I& H: f0 {# K" C/ m case 4:. i* W8 B! [4 G " h; o7 G& o0 e1 z3 ~; v6 U; U // 如果上一个操作符号优先级低于当前的,应加上括号 7 Q8 p/ [2 C6 @% [3 F' `8 r: ] if(j==0 || Sym[j-1] > 2) ; n# \6 H6 U2 t ~- x6 s {0 F6 X' u; Z5 |8 w Formula[len] = cSym[Sym[j]];8 X* T/ Y$ i, }: b2 A strcat(Formula,temp);: _0 |+ V6 J1 y' G x3 O }4 V7 v8 s" C5 {9 O% V, N else n" w" t9 h! y& A! ~ { ; E) y8 _0 q" G2 p* h; X6 e" R int n; # d& p9 y* e$ ^( Q! Y9 Q3 e char *FormulaTemp = (char*)calloc(len+1,sizeof(char)); 2 I! w0 e, ^5 s3 K for(n=0;n% E. ^% R8 C3 a' y3 C* c { [. w& c6 b/ a; x) d, D. K FormulaTemp[n] = Formula[n]; 0 Q* W/ B0 Z0 M0 R3 M- @' C6 `1 T Formula[n] = 0;% T4 I6 j* Z& ~' U2 E& B# @ } ' y+ D5 {* x( `8 d p Formula[0] = '(';1 c4 G0 r- ^" \/ |8 ~- F, J. O/ ]% I strcat(Formula,FormulaTemp); - x: O5 F+ X% ~1 o8 c0 b free(FormulaTemp);# I9 _8 _2 w @; w( H+ j. d Formula[len+1] =')'; 8 T1 s0 i' |4 @5 V# _) S Formula[len+2] = cSym[Sym[j]]; : T Q( Y5 L$ I# a" R strcat(Formula,temp);) I( E8 m1 j, m. d8 @ } 7 Y. T5 X" L" {. U# C2 [0 J break;& r+ h% e8 T( ]9 ^3 d } * e7 {9 W7 b6 k8 I& q i++;j++;' L, z G- h9 \ } g" ]: B1 V" o( v printf("%s",Formula); f! H. `% \/ Z7 h4 \/ G printf("=%d\n",sum); 4 T. v: B, F) K w# j u( Z free(Formula); ) c$ A" w( |0 P, t } # `( }& `; w6 |9 @) ^9 d2 A ; m9 n! P7 I# h2 t // 以当前数组为基础得到一个从小到大排列的数组; n9 k; ?. t) M4 h // 返回非0表示穷举结束$ k. H# v5 [( ]0 a | int EnumArray(int *Num,int min,int max,int count): [. T# L' g! j% @* Y# a { , I( j x) R1 @( C% [ int i,top; 7 t$ N) M( G- g top = count-1;8 m, O& e4 P b5 V1 @" g! I3 V Num[top]++;# ?) g3 k' F) I# L9 k/ _' R while(Num[top]>max-count+top+1 && top>=0)) s+ A" o3 l6 L; h0 g { + A m5 N$ A! H0 I& }& u4 E top--;6 x4 n" e% _) F# @& c Num[top]++;+ q/ o/ d% A( a, H } 6 `% ]) n( E5 l8 j! w6 E for(i=top+1;i5 f0 z- }: a2 a { : P# l' H3 [/ o# x; }: Z' M; _ Num = Num[i-1]+1; + Y; M2 h- K- Z4 r! ?: j) T$ F } ! Q$ Y6 w) |4 b5 o9 {6 d% u9 [ if(Num[count-1] > max) return 1;& H5 x5 r# v9 l4 J else return 0;9 u& R6 ^8 C! ?: [: [ } 0 N. Y! f9 d( D% W8 r& A: D , M) l! t7 Z* s" L; X p' O) C // 不允许重复的初始化数组 ( o, E9 g! n2 @/ [1 d8 G: r void InitArray(int *Num,int min,int max,int count); D: ?/ g, E* w {4 R9 d; D. n! j0 z" G int i;4 ~' ]8 b3 p! Y, o& Z for(i=0;i=min+i; & C6 f. I4 Z$ J# |* T Num[count-1]--; l8 W1 u4 M6 z3 ]3 d2 N } : n: q8 [ `* ^$ b( p! W7 a( t 1 I% ~& S* ]4 k ( S8 n) P7 g c5 K+ G/ m7 W. s2 M6 u M+ b" G, G* E' F ' X" f* k {# Z' R3 v+ i# `
    [此贴子已经被作者于2004-5-2 14:50:47编辑过]
    " O2 p% F) W: t( ^ # G% p, m- U: ^* ^( @+ |; Sprintf("总计%d个式子\n",EnumFormula(1,10,4,24)); 的运行结果是:2 N* A# t7 Z2 U! h8 R6 r2 A 1+4+9+10=24 / i0 |# A/ ?- t) I# F1+5+8+10=24, l8 Q4 ]& i- r 1+6+7+10=245 k: a2 G. g8 J. A0 P* ^ 1+6+8+9=240 y- C% `3 w' V 2+3+9+10=24 . [6 |$ c' l; }) t) ^# h2+4+8+10=24 : K8 t) o3 V( C2+5+7+10=24 * ~- {/ w# b8 U- W2+5+8+9=24 ! b. o) `1 e; y, Z+ K2+6+7+9=24 # @' ?( _* Q) k1 \) l3+4+7+10=24 ! C1 I1 Q/ L& i+ a' u9 \' C/ w3+4+8+9=24 5 G3 d2 [) n6 k( Z# s3+5+6+10=24& _- h/ v g- r3 f' M, i5 n 3+5+7+9=24* a$ [" k2 w* }! b0 d 3+6+7+8=249 M) u+ |2 w3 \ Y+ Y. \ 4+5+6+9=24- k8 }0 I3 C* r5 D& b 4+5+7+8=246 w" D2 d* n0 f& Y W 这是什么意思?似乎是找出了 1 至 10 之间的和是24 的数据,这和完成计算24点,差很多吧?4 T* k, c, [) s H+ F8 Q 比如用户输入 2 ,5,7,8 程序应该能得到计算这四个数据得到24的表达式才行啊,这样就可以写一个游戏了。5 d% M) m; [. \- L& a 如: 1,5,7,8 有如下方法可以算出 24 t+ ?4 z" W9 q7 Y ((1+7)-5)*8 = 24 . h) {8 h/ f* e((7+1)-5)*8 = 24 . y6 _; j8 v! K5 q(1+7)*(8-5) = 24 1 l9 q$ B/ z- n- Y* K0 m. G1 J(7+1)*(8-5) = 24 $ A. q1 v) `9 \; j7 |$ v((1-5)+7)*8 = 240 u3 ~3 i- `- G5 i7 w o9 x2 T ((7-5)+1)*8 = 243 w! o( |6 i; h4 w (8-5)*(1+7) = 24" c3 F3 B- J5 l8 i8 @ (8-5)*(7+1) = 24 # G) j, r0 `. a# B5 [" W9 [' S8*(1+7-5) = 240 L8 v X6 n E# M, Y 8*((1+7)-5) = 24( |3 V8 T# p* x% X* r 8*(1+(7-5)) = 24 % L" |# `) g( b8*(7+1-5) = 24 / ~& A9 J2 y+ Y# f7 X" i; a, I8*((7+1)-5) = 24) O2 r2 E+ A) y0 I- ? 8*(7+(1-5)) = 24 ; c6 f9 ~2 J# o) G8*(1-5+7) = 24 9 V" N; J/ a. j' R ^- }1 K8*((1-5)+7) = 24 ] _: E' t7 |# D% @ 8*(7-5+1) = 241 l* V0 t6 t( d 8*((7-5)+1) = 24 4 h. q& C. ~' t2 [& n, ~; i4 g

    该用户从未签到

    13
    发表于 2004-5-2 15:21:00 | 只看该作者
    结果是这样的:% r$ z6 I7 ~4 x- F" C
    1+4+9+10=24
    % A$ M) v3 l- `7 d( i" `1+5+8+10=24; I8 n% u  e) v0 W" m/ N) A
    1+6+7+10=24- A% M. m. H. i) h) M! s' h. v+ b2 i
    1+6+8+9=24
    0 u  K% A) @( S( ~+ @0 a% U2+3+9+10=24" R9 }' N8 P& z/ \7 V0 K" `5 \4 `
    2+4+8+10=24
    ! ?  z4 }# y. h) q1 I" q$ O* M2+5+7+10=248 i/ R9 w% U0 F) T+ n( a5 ~" J: G* j
    2+5+8+9=24
    5 }* N1 z. ?- Z- J) I& `+ o5 ]2+6+7+9=249 `* e+ T' J; h2 K8 ?5 ~  B
    3+4+7+10=24
    2 l* Q  B- _0 e! I3 v3+4+8+9=24/ o5 c9 u+ E0 s
    3+5+6+10=24; M6 B; k4 ]" X9 I" I
    3+5+7+9=24
    " Z$ K( v" y4 c* v, A7 F3+6+7+8=24. r1 Q& S2 w7 M# R
    4+5+6+9=24
    7 L7 ^) T# T: y2 X) P4 G6 r) ^4+5+7+8=24$ G9 j' _) h3 W6 E, m. [2 E
    1*5+9+10=24
    6 h% O/ f) k, |$ l' h' l) |1*6+8+10=24' Y3 ?/ f& s+ R! z" F0 F
    1*7+8+9=240 S6 c/ I. a7 e1 f2 q5 [3 Q
    2*3+8+10=246 s. ?% g( f% x: Y3 F" u
    2*4+6+10=242 W* |/ S! [  }9 [1 G. w5 s5 a! T' M
    2*4+7+9=24
    ' `0 r$ C2 N' n6 D- @2*5+6+8=24: |8 y4 V: ]& a2 O7 y1 h
    3*4+5+7=240 U- s. @- L1 M" C0 }( o9 L4 \
    4*5-6+10=241 J4 N' j, o% a9 _9 c3 i, \3 l
    (1+2)*5+9=24# o8 B( o" g9 l1 b
    (1+3)*4+8=24& j/ b. ~( H8 y1 t; r! p1 M- U3 b8 v
    1*2*7+10=24, R& ]* u9 W5 {
    1*3*5+9=24
    # V3 `7 Z1 n. D8 r3 L; N( a6*7-8-10=24
    * w3 |" J$ Q  `- }$ C(2+4)*5-6=24
    6 e! Y, s/ \  W* P  Y6 Z. I2*3*5-6=243 N# e6 W* l& w
    (1+2+3)*4=24" J/ Y- Z5 d0 S- p- b) C" ~5 N
    (1-2+4)*8=24# w9 C% g+ ~+ }; T
    (1-2+5)*6=24- ]; X- I& c7 D
    (1-3+5)*8=247 \  ]. ]! b: P2 ]# R
    (1-4+6)*8=24, f: m0 G; ?& A# }
    (1-5+7)*8=240 l+ D$ A4 B/ B5 E" R
    (2-3+4)*8=24
    + R$ i% @% x* W5 q- X9 k! R- {: Y(2-3+5)*6=24& d2 y2 L! ~" B$ U
    (2-4+5)*8=24# h+ l' Q3 R! W
    (2-5+6)*8=24
    : v7 ]0 R9 e- h(2-6+7)*8=24& n$ t/ X% m, x5 Y/ A9 \5 Z3 ~* O
    (3-4+5)*6=24% ?2 t8 u2 u/ K; q$ n8 y' B
    (4+5-6)*8=24+ z9 a# h+ t& S$ ^/ Z) z
    (4+6-7)*8=24
    0 R4 g8 j, u0 L) P0 Q(2*4-5)*8=24
    1 [7 e! j+ M  f8 a% C, }3 O(2*5-7)*8=24
    ) n# f4 I; A9 T' N1*2*3*4=24& O& u7 ?# ]+ O
    1/2*6*8=24  d4 ^# W; g# g; Y7 a
    1/3*8*9=24" y1 L  b9 E% b4 a
    2/3*4*9=24
    1 d9 p% l: ^5 G& c2 [2/4*6*8=24
    5 o. b7 R* D2 r/ _) S2/5*6*10=24
    2 n# {0 ]% N' E. F, M0 R2/6*8*9=243 q/ p. s6 G2 `, P6 n
    3*4/5*10=24
    ! A% U1 I  y# ~5*6*8/10=24
    * d3 @( v* u8 H$ S总计57个式子

    该用户从未签到

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

    [LV.1]初来乍到

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

    [LV.1]初来乍到

    16
    发表于 2004-5-2 15:28:00 | 只看该作者
    (2-1)*3*8 这个算式你就没有啊,这4个数字的组合都没有出现3 i, |8 s: ]$ Q
    1 Z6 w. S' t7 o! I$ @9 R5 c& n( ?; }

    " ~( M$ w$ O; e' r, R) V; z7 ^9 U. Z$ S. i; n+ t9 A

    6 k; y' X+ G) l0 Q# s2 j( \+ k1 @5 |) `3 k; t$ }
    7 v: P- l( i. v( z. x9 ~
    [此贴子已经被作者于2004-5-2 15:32:12编辑过]
    7 n7 ~2 ]1 \% z. I# B& f' a( [  H
  • 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 | 只看该作者
    / V, ?7 w+ e2 R" ?) E5 r
    ! c# s: t4 Z' r& H
    用这个好了,只不过输入的时候要按从小到大% }+ o3 E8 q0 x; p% W! x7 v
    / x( K0 ]6 c0 q, S  Y# |1 [
    好象有BUG,我暂时不太清楚

    该用户从未签到

    20
    发表于 2004-5-2 15:38:00 | 只看该作者
    以下是引用yzhlinux在2004-5-2 15:28:15的发言:# n# X" V; e1 p6 p2 |
    (2-1)*3*8 这个算式你就没有啊,这4个数字的组合都没有出现

      p7 T+ [  O/ u6 y# K0 X
    3 u8 K6 d1 d4 O' B: D本来为了防止诸如
    $ p7 D  ~! Z" t" O  `( Z9 O1*2*3*4" _/ V) F# u$ ?" j7 m; x
    1*3*4*2
    , D$ Y) ^8 F1 P5 i0 D) B4 g/ R: Y, D2*3*4*1* g0 S* L( z& b7 Z" N
    等的重复,只使用了从小到大的数组,不过这样好象也丢了不少可行的式子
    + x, m* p' X* ^; b! ^
    , T: }  |! k9 {/ l另外你的程序就是有这些重复的1 t- U6 R! E, Q# n
    % N2 B1 o8 {: x5 w, r: X
    PS:VB的程序感觉就是慢好多啊
    : l6 m  r8 H* o# C
    [此贴子已经被作者于2004-5-2 15:42:01编辑过]

    3 K5 }& K1 L" J

    本版积分规则

    关闭

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

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