下沙论坛

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

QQ登录

QQ登录

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

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

[复制链接]

该用户从未签到

跳转到指定楼层
1
发表于 2004-4-27 17:53:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
就是扑克里的24点游戏,4个数,+-*/得24……
# r1 R. z0 I" c7 {6 S" W' i
8 h* I; W8 j2 o" H' f0 \% z: ^6 e偶还在想……
分享到:  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的发言:9 d/ e% D) Z, q- g! m! k& ?
    穷举法吧
    1 |- f8 O/ X; Y7 U8 q
    那你的代码要写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 则表达试就是我们要求的了。比如:
    + t8 d. F. H, E* _4 N* ifunction GetMach(A,B,C,D) as String       '得到一个字符串组合如:(A+B*D)-C
    & q7 f3 y  `# k* `+ e$ Ofunction GetValue(MachString) as Float    '得到字符串的计算值 ,可能是小数
    . S) K/ ?! {, h; L" f; i% s那么程序就好写了:
    6 i0 H/ H3 [) ^% DGetNumber(&A,&B,&C,&D) ;    '得到ABCD则四个数字,赋给A,B,C,D四个变量6 |/ c0 u* Q" f) {7 s! ^1 F
    do{! L1 p, ?1 \$ r! B' T$ J/ p
      MachString = GetMach(A,B,C,D); '得到一个表达试的字符传
    ) p" b+ \# I& [4 E/ B  if(GetValue(MachString)==24) break;5 _& y5 \. r9 n
    }
    3 b( ?0 z6 B" H7 zprint XXXXXX;
    : |' H0 r  \2 v8 h- V# K

    该用户从未签到

    7
    发表于 2004-5-2 11:57:00 | 只看该作者
    我现在试着在写,就是不知道有什么好办法解决重复的算式问题,比如- F$ N0 T. y4 ~; F) @8 @& S$ _
    (5-2)*8*1' h* V7 h1 Z) K+ {' }4 A" u
    9 Y; L* U3 c3 K% A" Q- B
    (5-2)*1*8
      k4 Y) t0 n% U+ Y8*(5-2)*1% p: u8 t0 o% v8 S9 k& m
    等等
  • TA的每日心情
    奋斗
    2015-9-17 00:58
  • 签到天数: 1 天

    [LV.1]初来乍到

    8
    发表于 2004-5-2 13:17:00 | 只看该作者
    ! Q4 `3 b2 E4 S* t2 x' V. {; J7 u
    7 G* q; {# r5 h- J; q# ?
    花了一个上午,终于完成了
    6 n' C' r# a! r# ^% z你参考参考吧,哈哈! a2 ?; x& q4 t  ^) h

    1 _+ z3 f' X, D
    7 y* Q! O# U8 s0 I: L
    [此贴子已经被作者于2004-5-2 13:43:13编辑过]

    " I4 X! X, K0 W; B6 R
  • TA的每日心情
    奋斗
    2015-9-17 00:58
  • 签到天数: 1 天

    [LV.1]初来乍到

    9
    发表于 2004-5-2 13:42:00 | 只看该作者
    上面的发现有一点bug,
    * k: M) _/ n! r这个改过了: N" Z. _* D& W: \8 t. \4 r
    一个计算 24 点的小游戏
    7 G3 \" v" C9 V% k1 W) v+ sVB 编写: U# ?3 d7 S+ N. T/ u: @) c0 l; R. E
    3 F$ `  b- K- C5 s- I4 o( C

    8 ^& F# B( A  f# S# C0 B' a1 Z
    [此贴子已经被作者于2004-5-2 15:17:46编辑过]

    ( T8 U/ }( }" I  S

    该用户从未签到

    10
    发表于 2004-5-2 14:41:00 | 只看该作者
    #include 2 D [- ]: o: S9 t2 u #include . E$ c0 Z9 C% Y8 ?' O2 l3 E1 } , S8 J! E* j" O7 _int EnumFormula(int min,int max,int num,int sum);/ w q- {) g* x- f8 R void ShowFormula(int *Num,int *Sym,int count,int sum); 8 Z* E0 ~/ a5 p* f, i- p' v" zdouble GetFormulaVal(int *Num,int *Sym,int count); ) U8 R4 k; T7 q& vint EnumArray(int *Num,int min,int max,int count); 3 e! @5 N1 L( m% X1 y! j* Nvoid InitArray(int *Num,int min,int max,int count);$ _+ a( a7 ~9 g8 ]' H" `, w const char cSym[5] = {0,'+','-','*','/'};; B) h- A* F7 c, [ - M7 V+ W; r2 P+ E `! T: k( p int main(int argc, char *argv[])& f, O) i' [) E/ Z { 5 } D- J% Z9 C( S5 C7 e printf("总计%d个式子\n",EnumFormula(1,10,4,24)); 1 Y5 |% b+ n2 k1 v system("PAUSE"); 6 X: n0 c* l4 x0 s4 z/ ` return 0;* G: |8 r7 |) p) b* q }( L: O, j0 E9 j. I# U z' r+ c* e+ Eint EnumFormula(int min,int max,int num,int sum). q( |: f0 P' B# W& H+ W% y. R* D9 Q { : S+ L3 A& n8 r: F4 v! r8 E int *FormulaNum = (int*)calloc(num,sizeof(int)); //储存操作数 5 t5 ?8 g) t: o* T4 y //储存操作符号' K; }5 T2 f' y6 D //最后一位用于穷举结束标记1 @/ k; i; T3 [4 g // 1 - 4 代表 '+' '-' '*' '/'( v: K. ^0 A! \: Z" S1 Q- \ int *FormulaSym = (int*)calloc(num,sizeof(int));6 D8 N# z1 |! f, k) ~ 4 X' D5 V! k7 d. N int result = 0; / d m5 r+ a1 J/ _8 d // 初始化操作数和操作符号数组0 t( D+ o- b& u$ B) Y ' X$ b; r. F0 |5 n( P int i; ( W/ s* ]7 w$ l7 h$ o, Q9 |8 \! y4 Y X& }& W for(i=0;i = min; ( I+ l" y. L' a' |3 Q6 Q' Y9 H for(i=0;i = 1; . r7 t0 A: |2 K/ L$ h9 n" g+ U% o FormulaNum[0]--; / a/ A- H) i- N5 W( R% }3 K6 \* K- _. O6 T8 O, } InitArray(FormulaNum,min,max,num); 7 L& R& P" `, T1 M: o7 F$ ]0 q FormulaNum[num-1]++; % `# ?6 b" V, l4 o5 S; S$ O // 穷举操作数和操作符号组合 }1 t& G f6 o) Z while(FormulaSym[num-1] == 1)/ T- G$ E6 o1 d2 J. ]# d5 g {( s! V0 [! ?: ? p1 \ double t = GetFormulaVal(FormulaNum,FormulaSym,num) - sum; `2 J5 C; U9 j if(t>-0.01 && t<0.01)" r" `3 B2 I7 Y6 y. f+ N% l { 6 {; `2 ^5 J2 [5 {& }3 o; @" B/ f //printf("%d %d %d %d | %d %d %d ",FormulaNum[0],FormulaNum[1], ( w. U' U: Q+ O3 [ //FormulaNum[2],FormulaNum[3], / w) b0 c+ P' x6 V // FormulaSym[0],FormulaSym[1], 5 }* j0 v# k0 I6 j" L // FormulaSym[2],FormulaSym[3]); # i6 n3 J8 t( l+ o" ?3 o ShowFormula(FormulaNum,FormulaSym,num,sum); & u- N. T4 b5 r, Y( e. _2 T result++; : X; Q. [) H: ]/ ?' \ }$ l; v$ }3 b- [5 j4 z2 F ' z, B& d: t6 ^) I8 M" ?0 B" _ // 依次穷举操作数! e8 L" Q5 A1 N. C1 U0 @+ q3 | ' e% S n7 N* S& U$ P9 c/ _ //允许数字重复的穷举 / E, ?' X* h1 m; _$ m# J9 Y) n //FormulaNum[0]++; ' c% ?& [- P$ b! |" g //for(i=0;FormulaNum > max && i 3 P# {: k) l8 W ] //{ # P) v' w6 K" d# U* O/ C& [ // FormulaNum = min; ) H: J# L( ?; R/ a# j // FormulaNum[i+1]++; 7 B! {3 \% W4 h //}2 d) H. n$ {# b: n" G( c t // 操作数穷举与操作符号穷举联接- ^# D" D4 J/ o1 M) C% P8 y. w$ U //if(FormulaNum[num-1] > max)5 c5 f" w, {9 K1 h) @% v7 ^ //{ $ O5 s2 ]3 w: E- G8 { // FormulaNum[num-1] = min;0 [/ i; {' C# N7 t5 M // FormulaSym[0]++;( J7 N2 {1 C- a6 q //}2 V. ^6 P" b7 z! v1 J % ~) D& x; Z: a. O' J // 不允许数字重复的穷举 ; i' s+ |/ p4 C, b4 x // 数字必须从小到大的排列,防止重复0 x! i7 |# E" [ C1 ]# L5 |( a! W if((max - min)< num) exit(0); // 出错 # B% {! Q' e& k2 t( i) r2 C3 ?& y4 Y) u6 X" e& x l; q! Z if(EnumArray(FormulaNum,min,max,num)) . u6 N! {# G/ D% n {7 P8 N5 ~6 e# c' ^0 Z( S FormulaSym[0]++; , Q1 u; t4 z$ z+ g InitArray(FormulaNum,min,max,num);0 T0 _' R2 P0 J, r" g FormulaNum[num-1]++; 1 x$ v* Y: _" Y9 I9 v( j7 U }' O9 M: k9 t3 m" \! ]* F, v - Z' A! M4 |/ {1 B+ T // 操作符号穷举9 d0 B% Q' r; [5 P; T for(i=0;FormulaSym > 4 && i9 j; ?. m/ {4 m; S. m; ]0 A' x1 L! z {) [! @# w1 M/ i9 ^* a* j+ G FormulaSym = 1; ) _! Z; Z# o; h2 @- ] FormulaSym[i+1]++; ( G& D. f6 r, ~ V4 l) u& L) h8 z }3 l% R0 I, {- D! C/ Z0 A j- o5 V& H2 J } / R" o& R& s ~ //释放空间 & P! W5 m; V- `' Q) s free(FormulaNum); ( G7 M% f- N* ~% d% ` free(FormulaSym);1 I6 w v5 ]+ m return result;0 S5 V( w, `+ n+ C }( P( E6 t# y* _9 R. E `$ ^8 t // 计算算式结果; b) M3 m2 B- f$ ^8 f double GetFormulaVal(int *Num,int *Sym,int count) % G6 w" Z2 a7 h2 b' ]9 e' l& o8 O- d8 K{ % t. A4 J. n l7 \1 D int i,j; 2 @3 X8 I7 Z& W5 r! I. D2 T7 k6 S" G double preresult; 3 ~) y1 ?5 U+ l preresult = Num[0]; / @2 X. ^% d0 f5 o9 T i=1;j=0;0 A2 S$ Q9 F8 [. ` while(i/ r( `3 O- n( g% T { 2 e. D0 b: }- w. r switch(Sym[j]) ! l& H9 H& m8 q9 V. [* l$ B% } {3 E) F% `, F8 c }/ T6 [- b case 1: 3 s- i) T$ X0 {/ ~ preresult += Num;% t1 @2 V- ?7 c break; : ~# r# d( l; r/ A2 Y, `+ t" r case 2: ) Y2 W8 v. E5 J preresult -= Num;2 \# W3 g6 u$ I# _ break;4 L4 K% L) @% J& O3 G/ n0 Q: O case 3:) `- i" E4 D [ preresult *= Num;6 J# Y' J# f! I8 V9 [7 b1 d break; 6 C0 z5 A A6 u case 4: + a) R4 g/ X1 a# R k if(Num == 0) return -1000; ! h! t: @- S# e% r. G preresult /= Num; ( j' |; s% D2 R8 Y break; ! a9 [+ G. ? y @5 u }. Z0 P; w' y- G ?2 q i++;j++;! I# t( |% V' `! A& a } 2 I1 l0 H- g* [( Q( |: p5 |* k return preresult; //进行修正 6 D! ?* w2 K/ F+ U( d$ n! N( T} n, l. z6 W6 e& ^, y // 打印算式" y9 K) d" [" u1 P! r4 X) d void ShowFormula(int *Num,int *Sym,int count,int sum). e9 K' Y; D" _1 U/ r L4 ^9 l7 m { ' Y3 ^& F3 p5 O" \& X8 T2 S9 H* `- y6 z% Z int i,j,len; 8 _; E8 i% _3 @7 P, z% | char *Formula = (char*)calloc(count*4,sizeof(char));& f) Z, k5 c" v4 R/ D. ]2 h2 V9 ` char temp[10]; " X( A* M3 i7 g" ]/ s3 P3 l5 ?) G+ H itoa(Num[0],Formula,10);5 K: @) \1 z. b i=1;j=0; ! H0 |1 a3 r5 @ while(i1 |4 G& J9 x& C4 o8 e {( b V0 ~3 a0 d, C4 s' _ itoa(Num,temp,10); ! y0 U' b: Q$ p5 U: r: w len = strlen(Formula);7 }: l7 W2 u# s+ i switch(Sym[j]) 7 O( G" B8 ^8 o* S6 W+ Z {) t* ~, o6 v5 a7 W9 q case 1:# v0 k3 z8 G6 Y0 k+ e case 2: 1 o- b- c) F; R3 t1 U1 _& N( R/ Z Formula[len] = cSym[Sym[j]];7 R0 e, L- |/ K& n/ p strcat(Formula,temp);3 u# j9 G5 E* |9 p8 b3 y break; 7 e# O Y0 ]# [; @+ J case 3:/ G$ D' q3 a- n6 G1 T; U5 e, k( K case 4: / ~8 ^- I1 |* K9 W * H( M9 ^* {0 B$ B% P% D" D+ V // 如果上一个操作符号优先级低于当前的,应加上括号7 [ Z- \& k! ^: F: r/ M" h: f if(j==0 || Sym[j-1] > 2)) y2 u% P0 w$ i" y4 y {; _. c6 h7 `0 @ Formula[len] = cSym[Sym[j]]; ' ?( j& ^9 T. E$ C' | strcat(Formula,temp);7 S Z3 M) o- Q% W8 o' G/ v } % v f6 b9 Q; e: c8 X else# z* e( p# t! R% p {( v8 o0 e' q0 z% A, A int n;' m, O5 t Q& R) O* K char *FormulaTemp = (char*)calloc(len+1,sizeof(char));3 Q. Q' D n/ I I. m C. f for(n=0;n) f! _2 n8 X' l% `) v- N {$ ?1 S& p% ?4 B) H& S FormulaTemp[n] = Formula[n];3 L( A% b* R$ t& ` Formula[n] = 0; " S$ o% S$ D) L: h$ q }$ _. }. f+ {9 o H8 p U9 R+ d! Y: S Formula[0] = '('; , w$ v+ ^$ `: w' {$ W strcat(Formula,FormulaTemp);3 W g$ ?/ E* ?" k# R) T" G, h free(FormulaTemp);3 n& f. v% S7 d- t# h Formula[len+1] =')'; 8 t' N1 I8 L6 l Formula[len+2] = cSym[Sym[j]]; & o: i' d% T% G) l8 Y strcat(Formula,temp); : S. A8 M9 s5 M8 r' R* ?' u U }+ I2 `' o @, f) W8 r5 \( k! y9 f break;% i K9 t2 d, u2 r+ @, Y }$ W8 Q& h0 b! w5 W i++;j++; 8 A+ n: y3 @' [6 K } 0 N+ ]3 F& M- [) K printf("%s",Formula); ) S1 v6 i6 j, ` printf("=%d\n",sum);+ A9 t$ r6 b7 E1 P free(Formula);7 B, b3 F+ n1 d } 9 I; F1 V9 Y, h% D" v* G: ] p 6 X3 H6 q: ^. P! R# U% Y// 以当前数组为基础得到一个从小到大排列的数组5 Q7 g6 d% T& \* `6 Q$ R // 返回非0表示穷举结束 & x- ]9 f$ ^. H4 [5 Q" t. d, iint EnumArray(int *Num,int min,int max,int count)& Q' ?7 K! V, _/ f: |4 g( A1 V {0 j: N q+ }* Q7 I int i,top;& d H" R; P6 L3 I top = count-1; 2 \. c* B, N# A2 A Num[top]++; 0 u9 ]& G/ I# _7 D9 t0 B$ U while(Num[top]>max-count+top+1 && top>=0) ! _# e U7 s! {7 {% ]0 T- V { , f! w8 a- c. M9 p/ F' g3 J. T top--; 5 V4 u: j( Q7 B7 c Num[top]++; ) q3 Q. [: e! B5 A% t } ( U/ U Q3 x! F( K for(i=top+1;i' ? c- s5 C( X' N E { : J. B8 B: D8 f$ j Num = Num[i-1]+1; " s$ h. f. p! }9 | } 3 I4 N/ p' D8 `1 E7 ]8 H if(Num[count-1] > max) return 1; : m$ U& F4 u7 H! X else return 0; * t- G4 x- R+ a+ f3 K6 Y3 j} , f+ b" X. D3 |$ i( X ) w7 \$ o+ @, l- ?* a8 f// 不允许重复的初始化数组 - C' G5 r7 a+ Bvoid InitArray(int *Num,int min,int max,int count) `5 D7 @2 l6 F; a* G6 Q( i2 p{ + f* o; x- v/ ~" V, ]6 \5 J' _3 S int i;" v' h* N, @ r8 A4 T0 K5 |7 p0 D' ^& J for(i=0;i=min+i;# T" ^. J) t% n! L* L1 z Num[count-1]--; ) G9 I0 X$ y! P; i* m' T( p}+ X/ W1 Z& H8 ?; Y ' ]- K& k/ P" w* A5 n; {* j : a, f W6 G* R& z6 { ! e$ n7 V. s ]. ~* ^; ~7 ?8 h# V, B9 s' w! f
    [此贴子已经被作者于2004-5-2 14:50:47编辑过]
    1 C" a+ [* G, Z1 v1 r" A- C

    该用户从未签到

    11
    发表于 2004-5-2 14:54:00 | 只看该作者
    本法穷举出所有用min - max之间的num个数组成算式,结果为sum的情况
    & U$ Q. g6 @" a
    ) n9 i. ~  X  Q" s如要具体的话,可以不穷举操作数,直接输入操作数,进行操作符号穷举
  • TA的每日心情
    奋斗
    2015-9-17 00:58
  • 签到天数: 1 天

    [LV.1]初来乍到

    12
    发表于 2004-5-2 15:17:00 | 只看该作者
    以下是引用游侠无极限在2004-5-2 14:41:26的发言: n2 Q7 L0 l) @* n" j #include ; R7 B( }$ s! c9 `$ A' f #include ) Z% E) J( \: p / j6 [ Z7 E: u9 I$ _0 i1 r int EnumFormula(int min,int max,int num,int sum); : s4 u5 y8 v. g9 _ void ShowFormula(int *Num,int *Sym,int count,int sum); ( M- D9 b6 d5 r* B/ |7 j# d double GetFormulaVal(int *Num,int *Sym,int count);+ [2 H: v9 t) v$ X0 t" T7 P0 [ int EnumArray(int *Num,int min,int max,int count);. F* q2 f n' u void InitArray(int *Num,int min,int max,int count);. b: E: w% a+ `; ^3 _! e5 M const char cSym[5] = {0,'+','-','*','/'};# Q6 n8 q9 E& f C3 _ - \9 ]1 T) D9 Z3 i; b7 P int main(int argc, char *argv[]); j8 s0 T. u' ?. ]1 q5 ?8 z { % V) J2 d& `0 C% z printf("总计%d个式子\n",EnumFormula(1,10,4,24)); ! ^' V0 z. u& M3 |+ B* G system("AUSE"); 1 o O9 w( q0 U5 [( _+ | return 0; + G7 g! Z+ S: t- U& n }4 f; y6 K% [- f F z2 Q2 n $ O0 t: B; ~: u7 y( f int EnumFormula(int min,int max,int num,int sum) 4 X6 Q' B: K ~9 b: P: _% V& e( R { " V! [+ w o' T" b int *FormulaNum = (int*)calloc(num,sizeof(int)); //储存操作数 6 S. P# F4 X2 u1 a/ j //储存操作符号 2 W; v$ Y7 B* }( }9 u //最后一位用于穷举结束标记 0 z+ C7 j* ]* _0 {% q7 d+ w C // 1 - 4 代表 '+' '-' '*' '/' , n R r+ K6 r5 L) T5 e4 \ int *FormulaSym = (int*)calloc(num,sizeof(int)); ' \ [7 V# w' h4 g- s . k0 Z# {5 B* ]5 @' M3 ~7 d, ^ int result = 0; 4 Q" {6 n- W) l5 B# {) u7 ? p // 初始化操作数和操作符号数组 $ v& p( q. M* B* L0 [ 5 g' D: @% J+ F$ N) \4 j int i; $ \2 U y+ [* w5 @, h. }2 F4 X1 n2 A for(i=0;i = min; # J, n6 i4 [$ J! o for(i=0;i = 1; & X" p( D7 [9 Z4 C. { FormulaNum[0]--; / f$ A1 h0 A# i) U1 g' J+ ?( ~2 f7 ]7 H3 h InitArray(FormulaNum,min,max,num); " P, q. C# q0 D* [- K, r' O% @ FormulaNum[num-1]++; ! @3 U, _2 G. k) F/ G* v8 w) d // 穷举操作数和操作符号组合1 u* ^* j* T; P while(FormulaSym[num-1] == 1)1 O2 M# k$ l. g/ @8 g { 0 Q/ S5 j0 ~3 ^, o. O% R: E double t = GetFormulaVal(FormulaNum,FormulaSym,num) - sum; 7 ^1 Q2 \% b# k2 m# g3 N4 s if(t>-0.01 && t<0.01) * M2 \7 k& y- Z! X: h" u' |% E { * F* Q4 z3 d# I5 ~5 q0 t" k" a( | //printf("%d %d %d %d | %d %d %d ",FormulaNum[0],FormulaNum[1], . \, j2 L" b( p7 g7 ~& V //FormulaNum[2],FormulaNum[3], 1 r/ o1 |9 P6 j // FormulaSym[0],FormulaSym[1],. j+ z! W8 e9 D // FormulaSym[2],FormulaSym[3]);4 F6 u: j! r+ S; [% l ShowFormula(FormulaNum,FormulaSym,num,sum);7 ]0 k v# W) o9 i+ J# y+ t result++; ; |' ?; X, q3 N9 l$ |2 u- V }- A0 a! D: z5 U7 q. H# B + h) R% E" C( O. D3 M // 依次穷举操作数 . J! T- D7 u9 d4 I- c# i. N 3 v/ H/ o- k) g6 U6 w0 o, @ //允许数字重复的穷举 ' {) |1 V7 @7 E+ W //FormulaNum[0]++; f( c( @! t: b, m; W2 ~. o //for(i=0;FormulaNum > max && i : p. r& h( M0 U9 ^1 K0 D //{ 8 r2 O S4 u$ H1 w' ? // FormulaNum = min; 8 e9 n' ?: ], T; A8 P# ^6 M // FormulaNum[i+1]++;, q+ V+ X9 v) d //}9 i$ a) ^5 B9 Z4 A5 A // 操作数穷举与操作符号穷举联接 0 _6 ^4 b" K+ |& g //if(FormulaNum[num-1] > max) ( r/ r# G: l! p( U# t5 Y //{; x) e% [$ m0 {% j // FormulaNum[num-1] = min;3 z$ s8 ]! B' ^, \ // FormulaSym[0]++; 0 R2 ~3 h! I5 L1 s% B //}7 l0 x. i4 u! G, v8 k 7 H% b( S, ]' _9 R6 s/ I // 不允许数字重复的穷举 # r/ n* T+ Z) s; }( j // 数字必须从小到大的排列,防止重复; ?! ]$ s9 e* I$ R. | if((max - min)< num) exit(0); // 出错 0 }* q4 Y, P+ B6 D) |/ F |2 {. _6 @) }" g if(EnumArray(FormulaNum,min,max,num))) z' ~" ?- x2 `: r" {: l {; a! l& S3 `8 l7 N3 w FormulaSym[0]++; 9 N2 J! u$ m4 T' ^" o/ B InitArray(FormulaNum,min,max,num);5 F& x: T+ b+ }! w4 b q FormulaNum[num-1]++; " U8 t' f7 @& P V/ F) ?. a } 7 s ^0 ?% J- f : H3 N. V; h5 g/ \3 G! C) v/ i // 操作符号穷举3 q% P: {5 k/ v' f& X, e, X1 B8 r for(i=0;FormulaSym > 4 && i7 }' R2 u- e9 \ { 8 K4 O) I4 _$ c0 c2 ] FormulaSym = 1; & A5 n" j9 A) F' k FormulaSym[i+1]++;& Q/ ]0 g& k2 K) m% N: R } # W( ^5 \ X3 T+ T. f& U, u; x' J& t/ B+ @ }# ?8 r) p' P* z7 x7 P //释放空间0 }5 D9 }0 Y( d. `& J; b free(FormulaNum); 3 d6 T' }# u+ z free(FormulaSym);, R3 ?! B5 F% k0 ]3 o# \2 E return result; 3 x# U7 O/ K9 ` }1 a" p: J# V* N // 计算算式结果 ; g( B/ l, z% k double GetFormulaVal(int *Num,int *Sym,int count)2 v' B5 p' s2 i5 _ { . U+ z* y( }4 M7 u. b9 x& e int i,j;4 Y6 e( O8 n5 q2 U2 N( ? double preresult;; J/ _- }" V L* }0 Z0 W preresult = Num[0]; / F4 H5 O" ~& R) W4 k5 y9 G1 W' F i=1;j=0; $ B, X- R: ]2 G3 q0 s. C2 q R while(i9 l1 r) J: s( Z- Q/ R3 P { 2 q+ `1 Y& Q& r: N( V5 P2 i4 g5 e+ Y switch(Sym[j]): K! W; r& f8 {9 Y2 M% A% { {4 T4 s# P. Q3 K' L& F! I case 1:9 [/ i- z; l+ h b: I+ S6 P5 E7 X4 x preresult += Num;' y4 m' I5 M& W/ E, n break;8 ^4 N2 q& f# y7 u" K* ~1 T5 W case 2: , r) {7 B. B A: B) X& ]5 i preresult -= Num;+ s! u9 q u# Y) e% ^' r8 w break; - C4 A# C# x" l" H" O) {( K case 3: - y2 J8 X# |5 Z* w: c1 ~ preresult *= Num; 0 m& E! x6 o$ E0 w& f4 ^' b* ^ break; / l/ b, Y$ g% o7 g" F% o case 4: - d+ | ?% F) V) \: R if(Num == 0) return -1000;9 a4 j6 Q: U- d/ b3 o5 W preresult /= Num;1 a( _" G( u' _. A break;3 {( G( [2 ?- C2 m } # x2 f* l. a% h1 z& \+ c) D i++;j++; ( A1 `( @4 F4 _9 ^+ _; i8 z } 6 J4 e) Y% m4 k4 g; j return preresult; //进行修正 . K: J) j* J4 A" i$ _) @ } $ d3 X! c0 r' v: q* O: b& A // 打印算式! G; z. i9 f6 O void ShowFormula(int *Num,int *Sym,int count,int sum)7 s7 |" O: `' `$ |8 c- W { 0 U M0 I1 h8 O2 O; ~+ U / M5 [0 M1 n: ^1 I7 r# m3 L6 C' A2 p int i,j,len; z w6 h- u! Y' f" M char *Formula = (char*)calloc(count*4,sizeof(char));# ^' ]3 Q! s+ O! V7 j: H char temp[10]; 9 b' [1 z- n+ A* _ itoa(Num[0],Formula,10);; } P! v% T4 g* [ i=1;j=0; & ?/ w9 E! f$ E- Z1 A0 T2 n8 ~6 M while(i5 d8 k u$ |9 ?; Z {5 B6 p* m$ ]" y0 p/ Z9 r2 L itoa(Num,temp,10); ) R0 F, p1 R0 |9 d+ {6 U len = strlen(Formula);" K! y* x* p# x+ J9 U5 s switch(Sym[j]), k8 `. ?! T: J! x9 o, c& A5 w {' r) u3 d& J' L. ^8 i case 1: + w5 D% M$ Q) E4 ?* w0 r; j case 2:4 o( T, z# U# C+ T, \2 w Formula[len] = cSym[Sym[j]];9 z' N) J+ M" V4 [1 y4 ]0 K strcat(Formula,temp); $ \4 o7 t" I) @) f7 W9 _. | break;2 W0 @- _4 y# t4 N; X6 m case 3:' F" o' Z) B1 g case 4: 2 H5 _9 B z" A2 g/ W! w& I 8 p. C8 r5 A- x+ u // 如果上一个操作符号优先级低于当前的,应加上括号" H3 ~/ R4 a; f# W if(j==0 || Sym[j-1] > 2) / L Y1 s7 G+ Z& x" S: s% l# u* M. f {; `7 d: L Y! \) n Formula[len] = cSym[Sym[j]]; 5 b9 P O& d+ _5 j; ~- x: F strcat(Formula,temp);. T4 s* _% e) w1 K* @ } # ~6 k8 B2 o0 ~% l else & C) v' |2 T8 i) u' t6 y+ Q { / a' _8 y5 p' t- b6 z* h% [ int n; ; X- f V7 ?9 x" ?; V3 v; j8 E char *FormulaTemp = (char*)calloc(len+1,sizeof(char));/ O Y& j( w- [% l& I' X6 f for(n=0;n8 v) b3 {/ ?# h {# \) M' P7 f% k; m5 H( b8 \! J FormulaTemp[n] = Formula[n]; 3 b2 C: C# r' Y. g& a4 o Formula[n] = 0;0 m) ~6 C( U* _$ e } ; A( U1 [: O+ t% w% O* U6 Z Formula[0] = '(';4 @! Z4 e( b* {/ G3 Z2 \ strcat(Formula,FormulaTemp); ' U `6 J: J" ]2 t. v9 ` free(FormulaTemp); . O6 |9 B7 Z! h- ~/ @$ t# l Formula[len+1] =')'; : |3 y9 a2 V x+ }$ h4 z Formula[len+2] = cSym[Sym[j]]; 9 x( G& ^7 r+ w1 E7 g$ F strcat(Formula,temp); ! I% H4 b& G l2 u7 l. ~ } % h4 D1 h; k& I9 m, N6 l break;6 [+ h# H3 g% N- X$ O; m) ]# y }8 c* ~* ?! `( S) z4 } i++;j++;) [: G# S( U) m6 N- a } , i$ t. b( @' A. M% O3 f printf("%s",Formula);5 E) F1 `4 D6 m printf("=%d\n",sum); 4 g- f$ u. M/ n$ m5 P7 w free(Formula); ) S m9 E' _. c! j) [9 a0 h } , q3 D. C- U) g5 T( m2 t7 x, l" p- D : \2 ^: e( S& a1 {# s // 以当前数组为基础得到一个从小到大排列的数组: Q- F6 Z1 ^0 `% {9 u6 H // 返回非0表示穷举结束& V5 S8 L6 G B0 M2 |5 i- f5 v int EnumArray(int *Num,int min,int max,int count) + V% s/ a& R% a { ( h$ F" E/ } h+ G5 F( g- W5 q% X int i,top;' }) a5 Y7 Q$ J1 J; v! P8 q top = count-1;+ O' x8 Y$ K) X9 G/ D Num[top]++; ; H- c6 u# B; K: O3 W while(Num[top]>max-count+top+1 && top>=0) 2 l b( L1 n& P5 z { 9 e0 m& M2 i# r& b* e8 Y# H top--; . b; V6 |7 W. ]) {8 R4 O6 }" o Num[top]++;' Q+ |* |8 h/ ~) R- g# i& L6 g9 X1 q }0 K, l- O8 d. ? for(i=top+1;i' V' ~! I" F( ~- s4 j { 6 \' p/ P; u9 D( A4 T& X7 n Num = Num[i-1]+1;9 _( G0 ?) T4 Y. f7 F0 q/ s } - n s& U! t2 }( A3 t if(Num[count-1] > max) return 1;# V$ q0 d, } B, ^. L* T; M2 M else return 0;( J$ ~7 c% L& L: j! W }' i/ Z$ _# G0 v( ^& c1 }! ~- A w) P( s( a" X1 `, b" O // 不允许重复的初始化数组 - }8 C/ {/ |0 {1 u* G5 ~ void InitArray(int *Num,int min,int max,int count)3 N; A D. t; _' q* M { 0 A$ f- P" h6 g9 u. Q int i;6 Z& p% R9 O! K for(i=0;i=min+i; ' z7 h# A$ v) F Num[count-1]--; . y- H8 H. l/ Y& j, H* E- } } % b: E. D- X0 c! z1 }4 g 8 f+ R- [# q2 e# M , T8 |" L1 B+ |9 r: b ! \3 N4 D1 z& Y) [' N: T! [ 5 x6 _! {& S/ t( R. |
    [此贴子已经被作者于2004-5-2 14:50:47编辑过]
    6 Q$ W8 d* t) j, P D 5 l2 C* E( l( J: r$ o- l1 _7 c printf("总计%d个式子\n",EnumFormula(1,10,4,24)); 的运行结果是:/ D! z( b3 V0 n" W+ R 1+4+9+10=24 , F: [! ~' S; ]1 F+ E$ c1+5+8+10=246 B* t9 A. j7 u5 ^/ ^: G 1+6+7+10=24 9 a @ ^" `2 p. M1+6+8+9=249 Q. b8 A! b! Y f$ h 2+3+9+10=247 T8 R/ P$ y9 f# X/ d 2+4+8+10=24 4 M/ ]9 K) Y5 r) u" s2+5+7+10=24 - u8 W- i: K7 E, j2+5+8+9=24 6 j3 s# P. I1 U9 l2+6+7+9=243 _4 p6 B' z2 ?" \ 3+4+7+10=245 y& \( u0 g. r: Q& D# w) ~ 3+4+8+9=24 8 I$ P1 a' L, f0 P5 q1 @, L) h3+5+6+10=24( J+ U0 j& v) D 3+5+7+9=24( A3 R) O/ |% Y3 l' ~8 L 3+6+7+8=245 z$ n4 D! R+ l2 W 4+5+6+9=24 $ j( R2 S/ ]; B. \0 ^7 _4+5+7+8=248 w9 Z+ a- B- I8 q; V; ? 这是什么意思?似乎是找出了 1 至 10 之间的和是24 的数据,这和完成计算24点,差很多吧?* ^3 @) ~0 A4 D) z6 u 比如用户输入 2 ,5,7,8 程序应该能得到计算这四个数据得到24的表达式才行啊,这样就可以写一个游戏了。7 F$ N7 }9 K/ _( z9 V 如: 1,5,7,8 有如下方法可以算出 248 [1 W2 [: x- V7 Q, u* o# p1 H4 }1 H ((1+7)-5)*8 = 24( @: v- w5 |6 K: N ((7+1)-5)*8 = 24+ Q& \( R q* {" h9 H: F (1+7)*(8-5) = 24 ; f6 u4 u" [7 I$ |& z) I2 \(7+1)*(8-5) = 24( S$ _* m/ `* H* [2 Q ((1-5)+7)*8 = 249 ^& _+ H. K2 [. D' q6 Z* z ((7-5)+1)*8 = 24/ }$ g4 [! P- Q# Z (8-5)*(1+7) = 24) a( B* v |0 `& n* k9 \' c+ v9 h (8-5)*(7+1) = 24 h% r) A/ L0 J7 z) d6 v" h 8*(1+7-5) = 24 : ?; ~; }6 P) W; l, n+ k5 A8*((1+7)-5) = 24 $ J, w9 l' M& A. U# B8*(1+(7-5)) = 24. V) q! j! ?% { 8*(7+1-5) = 24 0 [3 ~ c% |9 {! {1 F) V% [8*((7+1)-5) = 24 ) l$ d+ B% q/ H/ N* T8*(7+(1-5)) = 24 5 }% G! x# ?4 R1 m# b2 p# \: c8*(1-5+7) = 24' p. V7 ?! C& G. C9 n |) \4 r 8*((1-5)+7) = 24 y/ f, @* G8 d& P& G9 o0 a$ E8*(7-5+1) = 24% X7 M/ L, K# G' R d5 s9 ]' L& V 8*((7-5)+1) = 24+ P' Y/ X1 C, Q: \

    该用户从未签到

    13
    发表于 2004-5-2 15:21:00 | 只看该作者
    结果是这样的:* l, N: c8 P8 C# S% T* J
    1+4+9+10=24" \0 @8 O- f* t/ q0 E" _
    1+5+8+10=24
    2 J9 ?/ ^. i8 h) ^1+6+7+10=24
    # o5 V& R* K0 T' T1+6+8+9=24% C" ^6 ^4 @$ C
    2+3+9+10=244 B+ j+ r  m. R1 r
    2+4+8+10=24# f  K; h+ R( S) [( `
    2+5+7+10=24
    5 F1 U9 [' {2 I. E& G+ L2+5+8+9=24
    9 Y3 g( t8 b: o" a3 q2+6+7+9=24
    % m( J6 ]9 q6 {: l  `5 m6 z3+4+7+10=24
    ; F; ?  m, C+ d3+4+8+9=24
    ( W; W% b# Q) U! g  }3+5+6+10=24
      y1 Q: E' k% K  ?; e3 F( F, m3+5+7+9=24
    3 D* \3 l& U: U) [" U+ O3+6+7+8=24# h0 b2 N) j, U  `
    4+5+6+9=24
    3 y: M6 q" O: d. a4+5+7+8=24
    ; A( d1 D# Y' Q3 L) d$ J8 L& b1*5+9+10=24
    ! k1 B% `6 [! e+ V1*6+8+10=24( F! m5 p* c2 Z5 C' o; W
    1*7+8+9=24
    6 p0 @! x/ a( q2*3+8+10=24
    * U  X, r. w, H! d* d5 q. a) w2*4+6+10=24
    - l; ?, l* q' O3 ~: a2 D& M. m2*4+7+9=247 s8 h3 Q  a- M" s& r
    2*5+6+8=24: b% A) U' C0 j& \# ^0 {
    3*4+5+7=24
    & k2 o. o4 [3 v% G; W4*5-6+10=24
    7 ~7 v' ^$ M( z- v% A(1+2)*5+9=248 k0 d) v& D6 n8 H6 Y4 r. L' c, L
    (1+3)*4+8=24
    8 R# ^0 @2 |8 t9 Q/ [) M3 J1*2*7+10=24- s! v& P8 P+ x4 R) }
    1*3*5+9=24
    1 A! O# T  f! R6 Z- _6*7-8-10=24. ~$ M1 b( g! j. f, }5 p; X
    (2+4)*5-6=24+ U/ I: y8 f$ `- T0 X
    2*3*5-6=24
    6 O  @* }4 [  _(1+2+3)*4=24" C7 A4 ]7 ?  k* X. u# h* l
    (1-2+4)*8=24
    - i2 ?! W+ }7 L* i/ Z6 C4 R6 F* `(1-2+5)*6=24
    : r& r% n5 ?" b$ N6 x+ p1 g# u(1-3+5)*8=24
    + N+ P  v7 x4 D+ U(1-4+6)*8=24
    ( i* x2 l7 [3 q+ M$ Q" y; l(1-5+7)*8=243 r+ C. w. {% W9 m9 f: l
    (2-3+4)*8=246 H6 K0 p' P8 w- W2 I2 v
    (2-3+5)*6=24
    7 ?% j5 \4 n7 P0 Z! X) H0 ^(2-4+5)*8=249 W5 s4 [% C, E7 j( a1 `
    (2-5+6)*8=24& e% D' o% S# a" @
    (2-6+7)*8=24/ Q& J* D8 a* H! m" n; g) q/ ^% t
    (3-4+5)*6=24
    1 V! K' n) s- y" `6 [: A! i5 @(4+5-6)*8=24
    9 z/ u! X, e# q# w% M(4+6-7)*8=24
    , Q: I$ g+ S& m1 m# ~- e; E(2*4-5)*8=24
    & z, j. g, r6 q# _(2*5-7)*8=24
    2 ?6 y- g. Q/ s" r1*2*3*4=248 A0 A( `6 J- b$ j7 k
    1/2*6*8=24
    : U, O6 n, }/ Q1/3*8*9=24
    / @/ t: M* b  Z2/3*4*9=24
    2 ^6 `* I& D3 D0 @( T2/4*6*8=243 Z$ |+ H( B; z* k7 D7 y1 D  ~
    2/5*6*10=24+ |9 W: p& I# F7 x
    2/6*8*9=24
    0 Y. o9 W; n3 @4 O( R3 V6 |  s3*4/5*10=24/ I/ u/ S4 l4 D
    5*6*8/10=24* L0 S# V, T/ Q& ^# a/ T
    总计57个式子

    该用户从未签到

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

    [LV.1]初来乍到

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

    [LV.1]初来乍到

    16
    发表于 2004-5-2 15:28:00 | 只看该作者
    (2-1)*3*8 这个算式你就没有啊,这4个数字的组合都没有出现
    9 b: R$ C, k0 U, g' p1 _) ?0 ^
    3 ]- |4 ~1 U& [
    ( {1 l$ X) T0 ]9 L$ V2 U9 e* h. c4 O- }+ W0 O6 ~2 j, A

    ) g" q7 v, U( X1 j( A7 m3 o  S, @. X

    7 u& q, o% D- {! }7 \6 w( g2 U
    [此贴子已经被作者于2004-5-2 15:32:12编辑过]

    , i9 {& E7 C( [% K* l/ q6 d( 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 | 只看该作者
    # |5 b  {) z4 ]" E! |7 _

    6 r* S1 @  I8 i7 k0 ]4 D- R! {用这个好了,只不过输入的时候要按从小到大2 c9 }% ^  ~2 x" @3 O

    * \; l3 g( @, v1 d7 s好象有BUG,我暂时不太清楚

    该用户从未签到

    20
    发表于 2004-5-2 15:38:00 | 只看该作者
    以下是引用yzhlinux在2004-5-2 15:28:15的发言:
    : r- A7 y; Q  L9 x, D* N7 t(2-1)*3*8 这个算式你就没有啊,这4个数字的组合都没有出现
    % |+ I: M8 Z" v0 M/ g
    ! H0 |6 Q8 f% m  H. `
    本来为了防止诸如
    ; E$ _7 F+ h8 j7 D+ M' B0 f1*2*3*4/ ?9 T. W1 o' q; W% m8 o! B
    1*3*4*2
    ! A! Z9 y" Q/ I- @9 w2*3*4*1" b. w0 E# `7 i% ^! k% h* E  Q
    等的重复,只使用了从小到大的数组,不过这样好象也丢了不少可行的式子
    0 ~7 y* E: Q! n* ]3 X2 [6 B) D) ?
    + Z( N  f/ r2 d1 y7 Z  g$ Q9 T# v另外你的程序就是有这些重复的1 k* B$ ]: U6 Z

    6 l! L4 C1 Y8 c$ k' N+ R% NPS:VB的程序感觉就是慢好多啊% [( `/ H2 R% U' O1 s- G
    [此贴子已经被作者于2004-5-2 15:42:01编辑过]
    ' a) H0 O$ k# A  w2 n5 m8 u1 n- P  j) v

    本版积分规则

    关闭

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

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