下沙论坛

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

QQ登录

QQ登录

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

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

[复制链接]

该用户从未签到

跳转到指定楼层
1
发表于 2004-4-27 17:53:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
就是扑克里的24点游戏,4个数,+-*/得24……
2 H3 C" n# ]) ~4 ~
2 |7 M7 |; T: C9 a. K- m. j* g偶还在想……
分享到:  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) v) ?* n( y: K穷举法吧

    - m* Q( }3 V7 t4 w5 P. w那你的代码要写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 O% O. U' f$ o- sfunction GetMach(A,B,C,D) as String       '得到一个字符串组合如:(A+B*D)-C
    . T/ J- y$ `" m/ t# tfunction GetValue(MachString) as Float    '得到字符串的计算值 ,可能是小数
    0 G& q% ?/ n$ j, J" ]6 n) ^那么程序就好写了:
    2 _7 z( {# G3 CGetNumber(&A,&B,&C,&D) ;    '得到ABCD则四个数字,赋给A,B,C,D四个变量+ r, @" g0 ?$ C: Z3 F- t
    do{5 ]6 J4 _! K4 b" ]
      MachString = GetMach(A,B,C,D); '得到一个表达试的字符传1 }8 f7 a, x/ c
      if(GetValue(MachString)==24) break;
    2 [+ X5 n* L. X. _: n5 @7 G, j; k}- y& L4 Z2 r/ W0 L& n& |; K/ s
    print XXXXXX;# r& U+ D$ G9 q; \/ O, e4 U+ O: k% ~+ Q3 f

    该用户从未签到

    7
    发表于 2004-5-2 11:57:00 | 只看该作者
    我现在试着在写,就是不知道有什么好办法解决重复的算式问题,比如
    + h1 i: K1 d  W& f$ l; J# u5 {(5-2)*8*1
    + Z4 N" H. s3 `$ d/ ^( W4 ?
    : l9 B3 f1 g: D& _(5-2)*1*8
    ; \0 S! }) I8 e6 t8*(5-2)*1
    , G. K6 Y; `) l3 T等等
  • TA的每日心情
    奋斗
    2015-9-17 00:58
  • 签到天数: 1 天

    [LV.1]初来乍到

    8
    发表于 2004-5-2 13:17:00 | 只看该作者
    # ?( k9 A. i( {! K6 [

    - M' m. H# y# p0 I3 b# ?; o花了一个上午,终于完成了! U1 Q9 i' |" B8 T+ q' f
    你参考参考吧,哈哈' S% j# j1 l; x/ O* Y7 v7 |

    / a$ i! U- L( U+ l' ?$ S2 \; I  _2 z- \
    [此贴子已经被作者于2004-5-2 13:43:13编辑过]

    % |8 D; U1 e: N6 R6 Q0 k- _% ?
  • TA的每日心情
    奋斗
    2015-9-17 00:58
  • 签到天数: 1 天

    [LV.1]初来乍到

    9
    发表于 2004-5-2 13:42:00 | 只看该作者
    上面的发现有一点bug,% Q% i/ L, ^# G6 p1 }
    这个改过了
    & }& p) [+ [9 {( q$ W, T一个计算 24 点的小游戏
    / U. O3 a" f# Y; tVB 编写; c! A1 B* {( d& m  Q1 x: |( E

    # T1 H/ N8 K, D6 ]. {! ~" K
    9 K4 Z% s' V9 p2 L
    [此贴子已经被作者于2004-5-2 15:17:46编辑过]

    4 D3 ?3 {5 z  E. v- W; Y

    该用户从未签到

    10
    发表于 2004-5-2 14:41:00 | 只看该作者
    #include & j* ^! q2 D5 V! T7 L( h; w #include 1 g2 t% z8 A- @& l" q& x8 A; {+ p% v d+ }1 u4 r int EnumFormula(int min,int max,int num,int sum); 2 Q; [& n: J+ _' i4 ` Svoid ShowFormula(int *Num,int *Sym,int count,int sum); . H5 ?) B! ~7 B' adouble GetFormulaVal(int *Num,int *Sym,int count);+ K0 g+ ?2 b Y( m) `( W4 i( p3 Y int EnumArray(int *Num,int min,int max,int count); b, c1 d& y: Dvoid InitArray(int *Num,int min,int max,int count); " p9 u' F; T2 G" `; K: s+ F8 gconst char cSym[5] = {0,'+','-','*','/'};, u+ Y1 }5 R+ P3 L1 e ) }& @, Q$ Y/ A int main(int argc, char *argv[]) $ V* f, F2 E& {{ # e& x3 Y) s1 s/ j printf("总计%d个式子\n",EnumFormula(1,10,4,24));* S1 J( f8 l! _. X) s, Q4 l system("PAUSE"); 7 R! Y0 T' M0 i* R8 v return 0;& W9 R. j! u* l- T8 e# X( {" q" Z } / t: Z# R Q7 b" f6 p; Q5 h/ C8 ` int EnumFormula(int min,int max,int num,int sum) 7 E) E% q O0 K5 F{: J3 ~% _9 B) K* T7 e9 X8 z% F* n int *FormulaNum = (int*)calloc(num,sizeof(int)); //储存操作数 + w4 [+ @7 `6 g5 p. X' A //储存操作符号 3 U q' Z# i4 c //最后一位用于穷举结束标记; U! F! k9 j8 {% [* ^" I, Q4 ?' y // 1 - 4 代表 '+' '-' '*' '/'8 Y# K6 ^) d. X* Q o int *FormulaSym = (int*)calloc(num,sizeof(int));$ Z5 Y! l9 F6 U" j ! X7 j; h. M- J0 e$ W1 W& L* v int result = 0;2 {8 R" N9 v) M6 T8 x2 f // 初始化操作数和操作符号数组 / P" @9 f: p6 v% \4 Q/ Q' N/ p ' c. L( Y1 [# c# q7 {% J int i;% }( W* ]+ D( p' b! B , @6 m6 h7 Z$ O) U for(i=0;i = min;0 H1 v/ v) Y3 y. t for(i=0;i = 1; D5 t( M8 k, h$ E FormulaNum[0]--; o: s" B4 H6 w: Y6 a3 o/ n! K% |/ b5 E# g$ w& z- E* q InitArray(FormulaNum,min,max,num); 4 ^6 h. B5 D% x: H( Z6 F+ V FormulaNum[num-1]++; ' S0 w( D9 g) n0 }' }3 o // 穷举操作数和操作符号组合6 r0 T3 ?' {/ [6 a0 | while(FormulaSym[num-1] == 1) ( i" {4 N: Y, Z/ |+ l { . H9 \! B6 @7 n' o# L double t = GetFormulaVal(FormulaNum,FormulaSym,num) - sum; " c8 } s% v: K5 k0 F if(t>-0.01 && t<0.01) : w9 O% k- Z# Y( x# y$ {* o0 W { ' L6 f# M% g5 N* T8 H G& Q; t //printf("%d %d %d %d | %d %d %d ",FormulaNum[0],FormulaNum[1],! Y. }; m. x& \8 w' e //FormulaNum[2],FormulaNum[3], 2 @ s1 {8 ^/ I1 m! W // FormulaSym[0],FormulaSym[1],: w O* J% T5 t2 @7 k // FormulaSym[2],FormulaSym[3]); 6 Q" i$ l* h6 { ShowFormula(FormulaNum,FormulaSym,num,sum);2 _- ~5 u4 x, K8 R result++; + G$ d/ v, v4 a } / y \: D2 I$ m8 x : o, E5 r; R( | R4 p1 ? // 依次穷举操作数 * P3 N, @) o: A3 H- q) b" I & H, q% | r* m. F8 D/ a$ u //允许数字重复的穷举2 x( ]' a! i0 y( V/ a% a //FormulaNum[0]++; # a% P) V5 ^. P5 r1 H+ A; g //for(i=0;FormulaNum > max && i0 k0 c) h `' N$ K* o3 w# t //{ ; x; c% m! H" l9 s0 L) T J7 |/ v // FormulaNum = min;$ c5 i- t; M) _5 }. ~ k' J+ @ // FormulaNum[i+1]++; : H. H9 V6 k# K4 B9 W$ R //} : V6 ^$ ~+ u4 b // 操作数穷举与操作符号穷举联接 4 M# M/ e8 Q6 O* N1 t1 t P //if(FormulaNum[num-1] > max) * d* r# O, p$ W$ w: H3 n! i6 R //{ : g4 l, p# d4 p; `# ]; H0 W // FormulaNum[num-1] = min;: M( S3 D0 B7 _& `# Q/ N1 \& t // FormulaSym[0]++;" n* F- l$ [/ F7 r9 z! ~: }1 A //} ' d, z) Y+ y _ ' x5 b% ~+ B7 r$ I, {: G // 不允许数字重复的穷举 7 s! d: v) ~, i // 数字必须从小到大的排列,防止重复 . _4 _6 a- e1 W0 a" Y: j5 o2 V: } if((max - min)< num) exit(0); // 出错 % S q# i, f; {5 m$ o! ~( h. n) v3 S% | if(EnumArray(FormulaNum,min,max,num))2 ]6 E o `6 {$ q { 3 n, N" v6 I, W* ] FormulaSym[0]++; * `: A! T9 q6 n' k. D* A N. [7 M- V$ t0 J InitArray(FormulaNum,min,max,num); 4 U, G: Q* J3 F, O2 r n9 b FormulaNum[num-1]++; 4 n2 }6 c$ t) Y: @0 y' H9 ] } ' w( a6 ^1 @4 ?6 _0 O . |2 q/ p- M4 F. `( }0 b // 操作符号穷举$ l1 R9 Z0 L/ }2 g `9 Z for(i=0;FormulaSym > 4 && i! @1 E3 k0 q; w5 E5 A {) `9 }5 [$ b: u! n( r9 e& J, x FormulaSym = 1; 6 N) N1 d) d9 ~+ s4 a FormulaSym[i+1]++; 8 E k4 E* |8 G$ ` } " |8 p5 B' g' Y, `) r/ F- \2 [& }/ n3 ?* e9 L0 h) E# v. H$ Z/ l, j } / C r& O) M( d9 K( { //释放空间 7 c8 e, h! ]1 e4 { free(FormulaNum);2 s: t7 H! K9 I free(FormulaSym);% w9 D. B) R+ H5 ]# x6 n/ D return result; 7 I! _1 ]( K: c( E+ }. I}% v9 ]& c2 e3 X/ g // 计算算式结果6 P0 [& {- Y0 n* R! I. z& m double GetFormulaVal(int *Num,int *Sym,int count) 2 G7 q% U6 @' Q1 g4 u) c; X{ 5 J! |. d. C8 c int i,j; 6 o3 k% i, R% {+ y# o o' w double preresult; : d; |; }. k! g& z, i preresult = Num[0];( A8 V) d; Q$ Q% i. }( X: b6 ^ i=1;j=0;8 C8 Y% i# F4 a1 R$ W! A+ o while(i) R" J7 q3 |' M2 F8 C' q+ K { " ^3 T3 l: m: Z. `/ F. t4 v: R: y6 ~# S3 I switch(Sym[j])& ?: D7 M0 [! c7 f: ] {# T' K2 i7 `, l. `$ q- |3 V% } case 1: 0 A, e2 b( }( _! h h' H preresult += Num; 2 c2 A2 I% P/ n& G- u6 m# [ break;4 r1 j4 h6 x5 U. x+ B" q5 O case 2: 1 ?" \& J% M$ r( n preresult -= Num; 4 c8 m, x/ q* X break; q7 q- M2 b% K: S5 `" i case 3:1 i6 A5 ~6 E& l6 {& k. i/ ~ preresult *= Num;% D' a6 L- Q6 Q) c break; 8 {$ O# b6 y9 E g" Y case 4: ' O0 ?- i# f2 q& d if(Num == 0) return -1000;9 i. _0 i' _: u: s preresult /= Num; / h( X5 |' o; U0 |) G break;+ X7 @; m8 m; c! _3 x4 A2 {- D8 N9 K1 v }% ?3 h0 t- z) ^3 \6 h i++;j++; * p, ]5 F+ O0 ]7 }5 v5 j, c2 P }# k: |; _- U/ l: B5 A( a, _) x return preresult; //进行修正: L3 K0 M; k9 X3 k }3 [4 H+ l: n- g' f8 B# R/ D // 打印算式 ) a, o2 M4 v3 o! U+ q) T' Jvoid ShowFormula(int *Num,int *Sym,int count,int sum) 0 r9 F! Y& w' G; G" n# Q6 w{ 6 x6 a" A/ p0 o' a& C: p: p8 w- m/ M8 ]5 {; V0 ] int i,j,len; 1 ~+ r, O ^3 d. `1 i+ F char *Formula = (char*)calloc(count*4,sizeof(char));8 e8 x7 ?7 i- V6 q4 e char temp[10];8 ~7 x$ C8 A0 S4 D- A6 Z, z8 H itoa(Num[0],Formula,10); , b; ^$ r: _, W i=1;j=0;3 J4 D; b' z2 ]6 m7 J& b while(i6 @( g+ K3 }0 h" Q { & F! M, W! }. `1 W9 g0 \: u, h itoa(Num,temp,10);/ { |" m9 j& O; t len = strlen(Formula);3 w- ^, ?, {' e4 p+ V# @ switch(Sym[j]) ! o5 e5 B" @9 z { + W' M' K0 O" T+ q case 1: 0 O6 a+ V) D9 |# b case 2: / Z+ Z6 |" a& K3 h H Formula[len] = cSym[Sym[j]];7 t" q2 m% z0 k2 [ strcat(Formula,temp); : P* }3 j( P* \+ n. A& F break; * t9 q9 @2 r5 g6 N1 l case 3:+ q4 ]0 {; J' R p- Q) u case 4: % ~# H/ Q9 |& { / f5 I0 n6 H9 h' ~! l* ?8 O // 如果上一个操作符号优先级低于当前的,应加上括号 $ ]' k1 ?0 d8 }9 e& @' Q" s if(j==0 || Sym[j-1] > 2)* R& N, Z0 R% L3 s: ] { $ R7 H! i3 Y& U Formula[len] = cSym[Sym[j]];% l6 i" B4 ~0 f strcat(Formula,temp);* F$ y1 i9 f9 O }1 M$ u j7 @6 ^0 B5 [' B" D else , B1 I& M( j+ W! h+ ]5 {* E {" {6 P5 _1 g3 |0 X3 Q int n; 8 P% ]0 d |* u& ]/ X. y G8 u char *FormulaTemp = (char*)calloc(len+1,sizeof(char)); {& @! N. X; I& J! s. p% t/ U for(n=0;n. }$ x, g7 v9 ]) o6 F { / R8 x6 z. B" T7 T FormulaTemp[n] = Formula[n]; 6 A0 a' V0 |, J% U Formula[n] = 0; & a O( \) G/ u! U+ n }/ l2 y# {4 F: I* q4 Q) V3 {3 ^9 P% I' K Formula[0] = '(';) `/ o4 E& U. w k3 [0 M5 W W strcat(Formula,FormulaTemp); z; O0 S; j5 c9 O free(FormulaTemp);$ o. F- a, a' c Formula[len+1] =')';+ V0 s, Y+ ~2 Y- o& I Formula[len+2] = cSym[Sym[j]];5 r) L7 X$ k/ ~2 N$ z2 c strcat(Formula,temp); 3 |( l/ w- R' J1 @8 F }7 W) Y2 n1 {5 A* @ break;7 E$ A! B/ ^: m- R" s } 8 N2 H% L2 Q2 M2 ?1 l: W9 X; s i++;j++; $ {3 |: p. X/ `# f: y- W } . J! e" c. }! B printf("%s",Formula);$ h7 H. S- m0 ?1 |* C printf("=%d\n",sum);. [2 N3 W( Y3 W, D free(Formula); l3 A0 z" H% {3 D( E} & Z) L2 \; A4 D! f+ O; ^, r* p: m2 w // 以当前数组为基础得到一个从小到大排列的数组 $ b% X+ L2 a6 r, G3 d! G+ E0 Z// 返回非0表示穷举结束4 @, @- R' x9 r int EnumArray(int *Num,int min,int max,int count) 5 s2 M, R8 ]: i! B2 L{- }6 S0 F2 z: v- u5 I8 \ int i,top; # I5 O q, }3 u8 L top = count-1;! y F+ v, Y" W8 n& F3 S Num[top]++;5 G& V6 m* T; }) t1 o( {# w0 } while(Num[top]>max-count+top+1 && top>=0)3 n5 \) b1 T$ n { ) d+ f* v" P7 z# a t% { top--;; O0 `. k! ]0 E) g7 A& G9 r Num[top]++;( @! E+ ^% i* t' d: k } / t$ t; ]) C, w" W5 |1 \ for(i=top+1;i6 T) ^" h5 e7 A1 l6 q% }" R& k3 v {- Y0 m! C- g2 l+ c. V Num = Num[i-1]+1;+ H) N3 R) \9 ^ } ) i6 {) S& }! Y' p. \ if(Num[count-1] > max) return 1; 2 F( \4 T+ T! O& n* H) x- N W else return 0;1 `5 ^: D* z! G }1 _( v( F4 R9 B9 T 9 B% N, ~. q) l! o! W& b // 不允许重复的初始化数组 9 }% E& Z) B6 k" c$ \! Avoid InitArray(int *Num,int min,int max,int count): U5 q8 [% H4 Q1 F, S { ) H5 ?0 ~. L# e! C+ Z int i; 6 q4 @( E, s0 b' F1 a2 u3 ? for(i=0;i=min+i;: J: L0 b: t# G Num[count-1]--; * n! G6 x/ I* B$ y- h} $ @8 j9 N. p. c3 ?8 v6 ]6 } # `6 q% E. t( q2 i% n+ Z; _2 H 0 g( e6 H4 r- U) a( M0 _ 7 V+ `7 [- u g; _9 c. D0 R* u ) u8 u+ b! l3 B' C& |
    [此贴子已经被作者于2004-5-2 14:50:47编辑过]
    5 K( @- `8 f b% l; C$ r

    该用户从未签到

    11
    发表于 2004-5-2 14:54:00 | 只看该作者
    本法穷举出所有用min - max之间的num个数组成算式,结果为sum的情况
    % v3 o. k% R7 ~/ \0 q% L; m$ B1 t+ D/ x! A/ `
    如要具体的话,可以不穷举操作数,直接输入操作数,进行操作符号穷举
  • TA的每日心情
    奋斗
    2015-9-17 00:58
  • 签到天数: 1 天

    [LV.1]初来乍到

    12
    发表于 2004-5-2 15:17:00 | 只看该作者
    以下是引用游侠无极限在2004-5-2 14:41:26的发言:' b3 a& w1 ^0 T* p4 G #include - ?5 f; P/ H% j7 e5 \3 h #include 4 ?3 r1 E( m% d6 }! F% { : l: B+ `% o6 _0 P% a int EnumFormula(int min,int max,int num,int sum); : |6 z% M; \+ r: @9 ^ void ShowFormula(int *Num,int *Sym,int count,int sum); , j( m7 I+ ^6 W9 D4 z9 { double GetFormulaVal(int *Num,int *Sym,int count);. T4 ?# @0 N5 n, Z$ S int EnumArray(int *Num,int min,int max,int count);$ k* A# U- X* Z8 M( h2 A+ g void InitArray(int *Num,int min,int max,int count);0 k" z; g3 ~+ |* x const char cSym[5] = {0,'+','-','*','/'};6 X: d$ n. Z7 a" T ) D% ^% ?! H) k' E! W. { int main(int argc, char *argv[]) $ a# y, \: i! q$ [ {1 m& c7 g2 k# D4 e: Z `9 y printf("总计%d个式子\n",EnumFormula(1,10,4,24)); ' `) f8 h% J8 K+ E3 Z system("AUSE"); * ~0 h7 i; |5 b6 x: g( v7 ^ return 0; + R4 P# Q z5 r1 Z" x( ~: s } + G+ N+ Z/ m) T; Z' `2 V $ G5 T& L5 U- t+ f. U7 Y% k [2 L int EnumFormula(int min,int max,int num,int sum)' a' f7 i" n, b { 9 ~* v& T$ r9 J% b& y# B/ {7 R2 o9 Z int *FormulaNum = (int*)calloc(num,sizeof(int)); //储存操作数 0 `% X' {6 w5 L+ M //储存操作符号 - x$ C( e/ `# N/ C! W# K; b! s //最后一位用于穷举结束标记 2 i4 c8 U6 `6 t* f- X // 1 - 4 代表 '+' '-' '*' '/' , f& _1 R! F+ |' _) b int *FormulaSym = (int*)calloc(num,sizeof(int));0 f0 ]( \6 n C! Q# @( \/ W/ S / s- S, z2 w# V$ c* K# K int result = 0;8 ~4 P4 S: R8 n) p // 初始化操作数和操作符号数组 % o8 i' I' l6 f3 z3 n. N( b / s0 T% J) t R5 o% A! @1 P int i;! Z7 l: O- p$ f2 I , B1 @* K: ?. ]$ E2 x9 K u for(i=0;i = min;# A: v( ]6 I/ B for(i=0;i = 1; 9 a, P, w0 M4 r# s7 O% p FormulaNum[0]--;* B- U4 {$ V& \# L% J + B$ c' w# s2 z& J2 E; Z- z; Q InitArray(FormulaNum,min,max,num);* P) G& M. q* z, h4 b6 p8 O0 Z& \4 ` FormulaNum[num-1]++; + y- n9 z3 q0 p. Q2 d% } // 穷举操作数和操作符号组合9 `% L! Z$ }& |& C7 C3 ?% N while(FormulaSym[num-1] == 1) % ^, z# C K/ k { W$ K2 ?: T. F8 Y* A' f double t = GetFormulaVal(FormulaNum,FormulaSym,num) - sum;/ M' ^" R5 [) P5 A6 x3 c" Y9 u if(t>-0.01 && t<0.01)% H Y' y: Z# y { 7 Y% X2 t8 V0 f //printf("%d %d %d %d | %d %d %d ",FormulaNum[0],FormulaNum[1],: f1 E1 [' R2 f/ U5 m8 h //FormulaNum[2],FormulaNum[3],) I4 U5 E I5 |2 u% V7 g1 e% x // FormulaSym[0],FormulaSym[1], 3 ?1 n) Y. R' i( a // FormulaSym[2],FormulaSym[3]); 6 |; l) M. W1 B/ }/ z6 Q ShowFormula(FormulaNum,FormulaSym,num,sum); ; t* s7 f! V0 c" Z) q result++; ' k+ x# D9 N% }0 K } , o" J* Q0 E$ @1 u # o- S" p* R! j* U' L // 依次穷举操作数% \' E' G A: V: e* G9 G 4 c7 ?) N& p, b( E* c //允许数字重复的穷举4 @9 r2 l3 i: Q& B5 v) o //FormulaNum[0]++; & X0 |0 L8 D; U2 t4 F2 ^/ ^ //for(i=0;FormulaNum > max && i2 b; v0 q5 p$ W! y6 H( m //{ 0 Z5 O+ e. H5 E7 x // FormulaNum = min; . K4 d6 \8 q" W) B: V$ @) |$ z2 d // FormulaNum[i+1]++;/ {' _( }5 @- g8 T //} 8 @0 D' z2 w1 ~6 I w // 操作数穷举与操作符号穷举联接1 J! a8 u# f: A3 \ //if(FormulaNum[num-1] > max)+ |; ?' g& v6 k6 D //{- R9 r5 U- u/ l4 {0 H9 c: H // FormulaNum[num-1] = min; $ Y0 l, M9 Y! R // FormulaSym[0]++;: R) U0 [8 B, x( N) ~ //}% ?: X: {: _" r9 f* q* u3 o 0 H" X# j1 Y3 ~: r/ r& D+ E // 不允许数字重复的穷举 5 O' V& b- h4 w7 j l // 数字必须从小到大的排列,防止重复# ]& O5 `" L% a7 D% V: e if((max - min)< num) exit(0); // 出错& J7 x1 M( F# z2 R% M+ f) h ) J' K, C7 D: }/ ^ if(EnumArray(FormulaNum,min,max,num))* u$ l2 \& J; H- I1 Q { y2 h, g& h9 a5 X* l7 i5 u" Y FormulaSym[0]++; h9 Y6 x" {; y! F InitArray(FormulaNum,min,max,num); z3 l- e) q2 W+ ], P- _: j FormulaNum[num-1]++;9 w* o% T# }/ q2 K7 }- M A }, s5 Q! b% A: S( f P/ N1 p. l 0 Z6 c) d. q& b3 @" B // 操作符号穷举1 K: H8 D! \ ?9 } for(i=0;FormulaSym > 4 && i' c1 P4 @3 x! H( _8 Y- m M& `' [# @ { ' B! L5 L, A( @0 G; j% [ FormulaSym = 1; : n7 Y( C( ?# c: | FormulaSym[i+1]++; ' p P. i, f: K# \1 ]' v$ Z }0 t) k [! p- ~2 K6 B& K& g ' |: D; L j; ?0 j/ K _ } . q& j4 x. l( |3 k //释放空间7 ?5 q3 _% u5 u4 D+ U free(FormulaNum);, H' J" L# C7 |9 d free(FormulaSym);( Q( Q: v9 j w% E7 \7 W return result;+ G& Z5 m7 s. z) e6 o! D% n } 3 g6 b" H" ^: z# m- @ // 计算算式结果 3 P/ r/ S8 n. V8 c; b7 y d" h double GetFormulaVal(int *Num,int *Sym,int count) ! [, x# |5 J7 ?7 } {% Q- Y7 X/ I) Z int i,j;2 {' J; L* I/ k" `/ R- m. z8 t" [ double preresult; ; K8 t- K9 ~" ^, r preresult = Num[0]; $ G3 W2 v2 p" f4 s5 r! C i=1;j=0;% l1 j, p0 I) G6 M7 B, J& m while(i9 {1 i! P) V4 L. W0 Q8 Q8 x$ p0 M9 S) { {* g* e, N# |2 u* ^% E5 A# l: S switch(Sym[j]) # E& Q. W. Y2 O4 m {2 w \/ i# m+ ?) V( I1 t case 1:, D$ M* \) V+ O, I preresult += Num; 5 V+ [8 i" |% V! b6 N) ` break;0 F* W, N# ^8 i8 K3 { case 2: 4 J$ K" w' e" r; L: }' J1 T" p8 U preresult -= Num;& W( w& n5 _. `; t6 g, e1 N break;2 n8 a6 [ ]0 l; O, ?1 B% D case 3:% a( j' `7 C% n7 t* [6 {$ e preresult *= Num;$ p) r) e! T, F/ e! [ break; & D( g. U: e" x case 4: 2 K# J1 f, i0 k) n8 o; s if(Num == 0) return -1000; 3 A* S1 L+ O/ u1 F; L) C+ y$ w preresult /= Num;7 o# E" {4 ?; c4 G u break;/ t6 v4 l9 M, C b u }$ l* o* \% H- }; p% [( s% i) ` i++;j++;' a- f$ x. }; o } # c8 q2 G6 {. I% q# P return preresult; //进行修正 % ^( r' r& e8 ^* q; {3 c+ h } 4 M" m* I8 Q% ]+ z // 打印算式: ~9 E5 i3 \- M4 W. P# r! K; U* i void ShowFormula(int *Num,int *Sym,int count,int sum) 3 w" W* o2 O9 o {* E- O; [$ r; T& t 0 x) c0 c9 B" i2 t0 u. i int i,j,len; 9 S7 l0 T* D1 d, _9 d' p char *Formula = (char*)calloc(count*4,sizeof(char));1 x2 A- V) a! V! V char temp[10]; + f# D; S! j7 [ itoa(Num[0],Formula,10);' q, H' D: g/ ?. {; B( f# I i=1;j=0; 2 t# v$ d5 {( R$ O5 @" O while(i' R' e$ K- @4 m { 9 k+ Q. U7 `. H* ?# n T! o itoa(Num,temp,10);% p6 F3 Z3 j( _; L4 X# {. n len = strlen(Formula); 5 x' Z( z8 a+ t. Z; T switch(Sym[j]) 5 |. H& U! G& v" B h2 d/ H {+ Q; Z* _4 U# C) M) [ case 1: 2 } N! F0 M5 H7 Y g, H1 N3 _ case 2: ) M' o7 W. Y. o5 n1 C' l Formula[len] = cSym[Sym[j]]; ; X' P$ | R1 I T, b: H0 i strcat(Formula,temp);' u4 Z. f' P$ H# j: f" J5 l q break; 0 {0 e z9 E+ a5 F7 C: B$ J case 3:0 _5 F/ E( R% ^2 R) @ case 4:2 c; P* i7 \" G2 _& }% n . G2 V: Y8 E( l. C0 P* v2 _8 M/ z& Z // 如果上一个操作符号优先级低于当前的,应加上括号0 Y5 Z9 A5 n5 V" {: q) S if(j==0 || Sym[j-1] > 2)! |! k7 c- u6 j+ ~! a9 B, ^" n {$ H9 a4 ?( p4 t- I6 T4 K) ? Formula[len] = cSym[Sym[j]];0 Z, e( a' v2 L- p% F strcat(Formula,temp);: p* `1 m4 G8 [4 H% q/ I } 3 f" M- A" w/ v6 ]9 n else/ z3 o3 _. H/ O9 C' H4 n2 j8 D { % F0 ]0 t+ V+ `5 C0 J8 n int n;" x# y: U3 {9 B! q7 T char *FormulaTemp = (char*)calloc(len+1,sizeof(char)); / }2 f* _9 v) L# o) i7 y; C2 d' o for(n=0;n) d% C7 v( A, _. S% V) x: H8 q {' g! }! }4 Y9 C/ x FormulaTemp[n] = Formula[n];: [; Q% a' ? S6 S Formula[n] = 0; ' m7 f% X9 x6 k# m0 m }& u2 u/ l% u& b2 C Formula[0] = '(';% @2 A+ C- d Z! L- U7 r strcat(Formula,FormulaTemp); : D$ G+ G8 f4 X: ] free(FormulaTemp);2 G& V& g$ \, E+ u: U: h0 p$ d Formula[len+1] =')';0 i9 \9 F- v4 w3 ~+ g( b& O Formula[len+2] = cSym[Sym[j]];/ X( {6 t( C; P5 c0 r& Y strcat(Formula,temp); 8 }/ P- B- P5 e0 k$ [. J } . g- M( q+ p8 r6 {) b break; 8 [( ?6 A& W* y. j( q6 b$ t. |. V* }6 {( k }/ d4 J D2 ]+ R& L7 } i++;j++; M7 K8 h4 ~% m; \ }8 E: X/ s' \0 R/ z- G printf("%s",Formula);- Q* Y% j4 G, `& Y% H4 \ printf("=%d\n",sum);$ z* {6 I# S3 \; d4 p- |; s free(Formula);0 _) r" |5 M7 _: a t4 G1 L }8 N+ D4 b: b- i- E2 Y $ j! }0 z: v, _3 ~/ J8 p# | // 以当前数组为基础得到一个从小到大排列的数组3 y( e. X. m4 o8 c7 |/ @ Y7 e3 k // 返回非0表示穷举结束 $ l4 [+ B6 g: g3 i6 B: C5 @; [8 Z int EnumArray(int *Num,int min,int max,int count)0 D' i- F$ E4 j" H# G {+ e' O6 W! u9 k* c: z, r* B. @ int i,top; ! I4 x$ ~$ w/ N% o# c' { top = count-1; , N+ g/ E3 q: x3 ]% Q, Z! D Num[top]++;8 U0 `* E( q. ]" X while(Num[top]>max-count+top+1 && top>=0) + b1 s) N1 E8 q8 a {9 ]+ z$ c/ J: f$ M, C top--; 5 ]4 `3 X" q$ i" j Num[top]++;. k, I$ z D- a8 c( U }; U1 G5 P+ L, E1 ? for(i=top+1;i2 D6 g* X3 [7 W9 J4 z {0 _. g2 }# w% l Num = Num[i-1]+1;2 N: i- b6 i% s8 V( `5 Q }5 `3 t/ O1 v5 A if(Num[count-1] > max) return 1; , F! g' k( i9 i3 z( i. v else return 0; * Y& U# b2 k; Q4 S3 C: O } % Q/ C+ ^) y1 q8 {1 L. H ' F8 Q; B. r/ a3 m! d* _. s // 不允许重复的初始化数组4 d* }% z5 |/ Y+ w; w- I: M void InitArray(int *Num,int min,int max,int count) 6 T% L$ {5 p( ?# }: }6 S { ! b" t3 Z* t8 V) M int i;/ F6 k, L6 B/ ?. ^ W for(i=0;i=min+i; 2 n/ u9 e, t( T7 |& d. G* Q Num[count-1]--; 9 _ @' W# M7 n. c. X @/ A } ( ^ n0 z1 E: P" x3 e" w9 E+ ` x' N6 o# Y/ t( a9 q* ~ # _& D* K5 `7 \4 l- a9 n% U( w 3 d0 l/ e) z/ I% }' ~* v9 c; | 8 u3 Q% S& J7 P0 s
    [此贴子已经被作者于2004-5-2 14:50:47编辑过]
    # O; o. n2 X, U; f5 l% J4 K/ o, w7 O( h3 n0 V i printf("总计%d个式子\n",EnumFormula(1,10,4,24)); 的运行结果是:+ s+ d6 }8 K* p; K/ s+ X 1+4+9+10=24 5 b, S# V! ^# p5 n( I# s1+5+8+10=24* n; ]( b# |* W# u( h( |- L 1+6+7+10=248 P/ k# |& m) F3 d6 z( C& l" h2 N3 p" Y 1+6+8+9=24 + U5 k& n7 ^! R% e( |& W! j2+3+9+10=24 0 a( A$ Q- e# u2+4+8+10=245 l1 Q" {/ W( w) G- R8 q 2+5+7+10=24 * M5 ]' ?0 H0 T, T, \2+5+8+9=24* M" M, m* Q8 U1 _9 H 2+6+7+9=245 d. |4 f/ d$ ~$ l% o 3+4+7+10=24 9 q- s- I) m* W7 L$ z. `4 I2 r3+4+8+9=24! p9 W7 R' Z# z. E 3+5+6+10=24' N( ]0 k0 H$ p% H! m1 R3 J% B 3+5+7+9=24* W: Z4 M' o5 X8 `1 _ 3+6+7+8=24 # p8 W9 ]3 J7 U- J$ E) x% p6 _2 H0 V4+5+6+9=24 % ]/ z' Q( S% [ C8 T4+5+7+8=240 ~3 L: _ L" S* V% k7 M# _ 这是什么意思?似乎是找出了 1 至 10 之间的和是24 的数据,这和完成计算24点,差很多吧?) \0 Y+ f% |' w6 @/ K9 F4 [* P 比如用户输入 2 ,5,7,8 程序应该能得到计算这四个数据得到24的表达式才行啊,这样就可以写一个游戏了。 ) h: F, C9 _ n2 T( G: u如: 1,5,7,8 有如下方法可以算出 24 k) }5 i: a% @. o ((1+7)-5)*8 = 24 ) D, ]+ L8 R6 m- P: M((7+1)-5)*8 = 244 ~5 Y8 x0 I3 b& r1 U8 F (1+7)*(8-5) = 24$ J& ~" r1 J# a, G (7+1)*(8-5) = 244 G. G! x3 D. T7 L4 ` Z5 b! E2 J ((1-5)+7)*8 = 24 ' h! i% D- s. r K. r. p+ I((7-5)+1)*8 = 24 + s2 z$ y* [1 A5 t(8-5)*(1+7) = 24 a% g; N2 ]6 |5 o' M (8-5)*(7+1) = 24 ) X' V) E6 z9 W5 S4 I8*(1+7-5) = 24 : m/ Y; Q) v/ Z: U, S$ n3 D8*((1+7)-5) = 24 B5 J- I0 T3 F* E) p6 ?5 T 8*(1+(7-5)) = 24 & K/ d4 f$ Y6 i) S5 e8*(7+1-5) = 24 5 W, {7 l- a( c8*((7+1)-5) = 24 : ?" U1 [6 U: E# v' k8*(7+(1-5)) = 24) p) ]$ B2 c3 o. v 8*(1-5+7) = 24 5 }+ [7 }6 l2 O' q, E3 d( @8*((1-5)+7) = 24 & m5 `$ z; Q. f% P& o6 W" ~3 v( G8*(7-5+1) = 24 # v5 K. j( Q$ [2 v. d9 E6 Y8*((7-5)+1) = 242 C( t3 y$ R8 Q# y' M5 H! A' O

    该用户从未签到

    13
    发表于 2004-5-2 15:21:00 | 只看该作者
    结果是这样的:; ~$ x# S# Y6 ]% c; `
    1+4+9+10=24
    3 a: \3 o& w, y$ E7 F1+5+8+10=24
    7 W* P# b1 C$ S( m" {1+6+7+10=246 c4 C9 }. t2 w9 k
    1+6+8+9=24
    7 g6 K! ?( W% t+ B2+3+9+10=24
    ( k+ ~7 l7 F1 @3 j: r# J+ W2+4+8+10=24
    / O7 F  t: W% e8 W' f: {4 Z2+5+7+10=24
    . \4 C( A  {9 l% Y" Q, d% f2+5+8+9=24
    5 i5 z" O! W" v9 }2+6+7+9=24
    3 r) Y: k, C. y$ g# n3+4+7+10=245 O# ]% K0 p4 l3 w8 d% ?
    3+4+8+9=24- x" g9 B7 x$ N1 |
    3+5+6+10=24
    % e  \& q& L* t3+5+7+9=24* `9 b, f$ z5 A  ^8 ?5 v: I' G
    3+6+7+8=24
      S- {4 v! d# `: o4+5+6+9=24
    7 p2 d1 K7 n1 G. u- ?, G, m! x4+5+7+8=24
    7 x7 B9 @0 P4 Z+ N( Q0 d1*5+9+10=24
    2 T+ o$ P3 }; P1*6+8+10=24* `) m' Q8 w5 z& s0 s
    1*7+8+9=249 k1 L2 w( o% `1 v! W
    2*3+8+10=243 @( ?- x8 _. d# h
    2*4+6+10=24% E2 ~. \, @9 G( H7 u# u
    2*4+7+9=24, G! X2 Y( q) o
    2*5+6+8=24$ W( i% l$ C+ ~! |8 Y% b. O
    3*4+5+7=24
    0 a8 n. h; [/ |$ m1 E3 V: S) o4*5-6+10=24
    % M) i; H/ y" N# f; _" U(1+2)*5+9=243 E8 X' z- \. D" K" u, I
    (1+3)*4+8=245 D# }/ {/ G# ?6 R8 _
    1*2*7+10=24
    , C# Q, Y& J% u& O0 V1*3*5+9=249 C% y( d1 u7 m" u8 B: e
    6*7-8-10=24/ \$ o  u7 n5 G4 }
    (2+4)*5-6=24- e/ m/ v& B+ }
    2*3*5-6=24( [+ Z# u( _3 ~. L, b# }
    (1+2+3)*4=240 {1 ]& |- o7 f  t) e  V& ]3 Z9 B
    (1-2+4)*8=24
    . s9 R/ D1 C( f& w4 c1 |(1-2+5)*6=24
    $ I( l# C2 o4 k, W5 h(1-3+5)*8=24
    $ K2 B* R6 I( {% S# c! t& x(1-4+6)*8=24+ S$ v* F* U5 I$ O6 d5 k1 m5 P* U
    (1-5+7)*8=24
    2 P. E. T1 I1 q, u5 y$ i7 v, P(2-3+4)*8=24
    ) ]3 p/ |- y9 |4 L; s2 P8 f(2-3+5)*6=24
    ! Q3 a8 Z0 p: U; }(2-4+5)*8=245 z- K* y. v7 A; n: f
    (2-5+6)*8=24
    . H+ G8 s6 I3 \5 D( a, q( B. w(2-6+7)*8=24
    - `! `8 j2 P" \0 a(3-4+5)*6=24
    ( m# o- q0 S0 L4 u(4+5-6)*8=24
    ! ]6 U$ o. x4 O0 A. @& ?(4+6-7)*8=246 s; N; L3 O& e( P) }' K+ J
    (2*4-5)*8=24/ x! S* o0 a* k% f6 k8 d
    (2*5-7)*8=24
    " C6 p3 @" K/ G, u1*2*3*4=24
    * H5 d( y7 \% w" M. j* r- S( K' K1/2*6*8=249 H" s% _/ T/ a* n  Q1 ?6 Z
    1/3*8*9=24
    9 S2 }- J% k% H  V) y: y& j: p2/3*4*9=24
    ' c; ~1 k7 J( y2 ]2/4*6*8=24
    ' g1 P; q! \! U+ r4 }0 e2/5*6*10=24% V, k/ z3 U5 Z! A( l* ?' d$ [$ c
    2/6*8*9=24' v# ?" U2 {5 f8 _
    3*4/5*10=24( D# L) h7 b. c' L9 ^. u3 G/ ~
    5*6*8/10=24
    / [) G- ~3 Y$ ~* U总计57个式子

    该用户从未签到

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

    [LV.1]初来乍到

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

    [LV.1]初来乍到

    16
    发表于 2004-5-2 15:28:00 | 只看该作者
    (2-1)*3*8 这个算式你就没有啊,这4个数字的组合都没有出现
    4 F2 i# \' B! w, S" p
    , M2 R) M& I! v& [1 W9 X6 Q
    0 @8 R# z( H3 b: ]* i8 n
    ' v  J$ T* @; e% [& o- G% Z+ o5 u( r* X8 K8 Q4 R, B, F" G$ H# g; c

    , e6 s9 ~- A3 C$ S$ z! Y! R- b$ \
    [此贴子已经被作者于2004-5-2 15:32:12编辑过]
    : v, F/ U$ }, ]
  • 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 | 只看该作者
    ' l  R# b$ G$ N: L, R' C
    * ~/ O: h8 w/ l; Z3 X8 Q
    用这个好了,只不过输入的时候要按从小到大# f2 G" l8 q9 \2 G
    " j* O: Q' n0 f) n+ J
    好象有BUG,我暂时不太清楚

    该用户从未签到

    20
    发表于 2004-5-2 15:38:00 | 只看该作者
    以下是引用yzhlinux在2004-5-2 15:28:15的发言:
    ; A7 n% }7 m+ K0 G! u# d( {. M(2-1)*3*8 这个算式你就没有啊,这4个数字的组合都没有出现
    1 D, ^1 a8 x4 Y, C
    & s3 u! n# [; F5 R) C& G
    本来为了防止诸如
    & Z& w; [4 j& J# n: |4 o, ?1*2*3*4
    ' z# M" W1 ?7 X( p* @! V1*3*4*2  h7 R  F  m7 K; Y+ x
    2*3*4*1
    & P& V) b9 s1 Q) p等的重复,只使用了从小到大的数组,不过这样好象也丢了不少可行的式子1 C6 y4 N  C4 w" K* n

    0 Y# n" l9 V0 ]! i" Y另外你的程序就是有这些重复的0 ]/ d. k& U* ?" |8 ^" [  ?2 q
    8 R& ^8 u  Y3 S, k  G4 j+ G) |
    PS:VB的程序感觉就是慢好多啊- K9 B$ W6 s0 T& [" v7 A. b/ B
    [此贴子已经被作者于2004-5-2 15:42:01编辑过]
      i6 U3 E7 a$ b2 E5 ^- J

    本版积分规则

    关闭

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

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