下沙论坛

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

用新浪微博连接

一步搞定

QQ登录

QQ登录

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

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

[复制链接]

该用户从未签到

跳转到指定楼层
1
发表于 2004-4-27 17:53:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
就是扑克里的24点游戏,4个数,+-*/得24……' S7 }# d; h/ p4 B

1 N5 z4 j' X" Z偶还在想……
分享到:  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的发言:' z' Q5 Q6 O# h$ _% ]! l6 N
    穷举法吧

    , Y+ |% `# t, e* B. c' }% S% O那你的代码要写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 则表达试就是我们要求的了。比如:
    ( M6 d- B1 @1 N0 U$ r* w! Tfunction GetMach(A,B,C,D) as String       '得到一个字符串组合如:(A+B*D)-C- W/ A+ E! {0 Z8 ~# f* \( G4 F
    function GetValue(MachString) as Float    '得到字符串的计算值 ,可能是小数  X& ~; S# b% Z  i' l
    那么程序就好写了:" o9 j" W) T4 j: @+ [9 }8 ^
    GetNumber(&A,&B,&C,&D) ;    '得到ABCD则四个数字,赋给A,B,C,D四个变量
    9 k6 h. T3 b0 G3 Vdo{* h- {# j9 O! m2 T. |* Q
      MachString = GetMach(A,B,C,D); '得到一个表达试的字符传/ ]; p" v/ j- @3 L$ |$ A# q4 ^/ s( W
      if(GetValue(MachString)==24) break;
    6 e* F' O7 e3 V. I/ |}
    : v9 u& M3 B+ m+ i4 T4 Sprint XXXXXX;1 N: j& Q' J, v9 ~5 `+ ^

    该用户从未签到

    7
    发表于 2004-5-2 11:57:00 | 只看该作者
    我现在试着在写,就是不知道有什么好办法解决重复的算式问题,比如, z) u; U6 C4 E1 s. \
    (5-2)*8*1
    2 H) b. W; H0 C! D8 U  r% o, a9 d$ n) e, Y/ B! l% z0 E
    (5-2)*1*8
    . j- I6 `, V: k9 s3 s* _$ B5 G8*(5-2)*1
    5 A5 Z8 t3 p! q9 {& q2 n: \等等
  • TA的每日心情
    奋斗
    2015-9-17 00:58
  • 签到天数: 1 天

    [LV.1]初来乍到

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

    " p, W; q0 U( u/ z- D" m
    9 h; ?1 @7 R  a: E花了一个上午,终于完成了8 J" u0 K+ N% s
    你参考参考吧,哈哈) j+ O& `$ x' ?9 x2 h. d  e

    ! M7 d/ y8 S6 ]; K
    ' k! u$ h% P& E: \) P7 e% h
    [此贴子已经被作者于2004-5-2 13:43:13编辑过]
    : d% B$ S- l6 W1 z$ c
  • TA的每日心情
    奋斗
    2015-9-17 00:58
  • 签到天数: 1 天

    [LV.1]初来乍到

    9
    发表于 2004-5-2 13:42:00 | 只看该作者
    上面的发现有一点bug,. w: X% V! ]& f
    这个改过了( D0 j* i* k' L9 K; {" i, g
    一个计算 24 点的小游戏0 q' ~9 C+ }$ u
    VB 编写+ Z' h, Y: E& H1 @# @( v
    2 w, N; L( b7 A2 X  z
    ; U" P6 g# s- D
    [此贴子已经被作者于2004-5-2 15:17:46编辑过]
    6 U) h& ]+ K" F/ ]. R/ V, U

    该用户从未签到

    10
    发表于 2004-5-2 14:41:00 | 只看该作者
    #include . q2 T3 B) s' U, u #include " q+ S& X. V% J; p3 S/ d( p( T+ ~- _; \2 g int EnumFormula(int min,int max,int num,int sum);' z. o) I G0 n$ E void ShowFormula(int *Num,int *Sym,int count,int sum); ( R2 Z" ?0 S$ G0 Jdouble GetFormulaVal(int *Num,int *Sym,int count); 2 _. W5 J0 p, r/ `3 Fint EnumArray(int *Num,int min,int max,int count); ! b( |" d8 K1 Z `void InitArray(int *Num,int min,int max,int count);) S( D0 x6 k8 }2 { const char cSym[5] = {0,'+','-','*','/'}; ) ]7 p# _1 N/ ~! Y- H0 L9 W8 l ; m7 X) u0 H e) S: rint main(int argc, char *argv[])" L$ ~: `/ p* g {3 D! j- C! x& ] printf("总计%d个式子\n",EnumFormula(1,10,4,24)); * d: t, `) e: [7 f) F system("PAUSE"); 9 p8 J1 D) u( i& W7 ` return 0;2 M$ `/ I7 ]" k! c2 u } z% W0 [, E5 U3 g8 y3 g+ u# J : a2 E/ ?# U' Kint EnumFormula(int min,int max,int num,int sum) W2 J- n9 J c& F1 p# N4 A# g{ }- ~9 b3 K' F% N6 ^% I' X2 x2 ~ int *FormulaNum = (int*)calloc(num,sizeof(int)); //储存操作数 5 y) ?# L( [9 |! U% ~ k //储存操作符号7 h3 `: ?3 v3 X7 l. T //最后一位用于穷举结束标记8 X5 P$ U) j4 ]( f: j y$ P // 1 - 4 代表 '+' '-' '*' '/'! {* v6 n+ v2 u9 S5 }8 p int *FormulaSym = (int*)calloc(num,sizeof(int)); 7 x8 \* |+ r5 l0 \* h) g8 w2 z ( _0 c& q- i; i- _ int result = 0; * ~1 U8 `) c o! a1 q, D2 t- c" @ // 初始化操作数和操作符号数组! p& g& Q4 [- @* F : f* U- C: ^& _7 g8 U int i;* q- G) ~' D+ U2 N+ U" S 4 y1 C5 E0 n/ E; d for(i=0;i = min;/ K Q$ W2 P- X' H. M8 d for(i=0;i = 1; " [$ b! c( ]6 Q" D FormulaNum[0]--; P. W% Y4 U- f8 c$ B' W3 V 3 Y+ n9 K5 Q5 b1 ] b5 _9 g, {7 P) ~ InitArray(FormulaNum,min,max,num);9 }8 {7 S$ f- y FormulaNum[num-1]++; # x& T- i7 Z3 `( O% w // 穷举操作数和操作符号组合 % e# ~7 b8 R5 V while(FormulaSym[num-1] == 1) 2 V2 g+ r6 q$ S2 L6 C/ e: t# V' ^& B { ( M F [( P2 {5 z+ l double t = GetFormulaVal(FormulaNum,FormulaSym,num) - sum; " m" w% K( o. l0 K+ j if(t>-0.01 && t<0.01) / X0 ]$ ^' ]/ A { % K& d e" X) I //printf("%d %d %d %d | %d %d %d ",FormulaNum[0],FormulaNum[1],' Y# w- s( h m% N //FormulaNum[2],FormulaNum[3], e( { ~% E- P" z% h J* ^ // FormulaSym[0],FormulaSym[1],2 k c# _' I" D1 P // FormulaSym[2],FormulaSym[3]);2 p6 A+ Y+ [# R2 o8 M0 T ShowFormula(FormulaNum,FormulaSym,num,sum);0 C* s3 V+ C2 ~4 ? result++;8 D* \7 U& g$ c9 u, d( O7 n }" B! U I/ f& ?4 { ; I& n- E1 K4 u* [; ^* R3 U8 [ // 依次穷举操作数+ { m/ \# B( `" ? 3 z" u& t. j/ e) A3 p. ]# ~ //允许数字重复的穷举 6 P$ W4 A2 o) c6 ? //FormulaNum[0]++;8 y. x7 R/ ^1 q+ {& h //for(i=0;FormulaNum > max && i ) [1 l7 R" L# A {6 g //{$ F. a3 N+ W$ t2 F/ Z0 e, r( V // FormulaNum = min; 9 @2 e# O% S7 {6 P* z/ r& G* O6 L // FormulaNum[i+1]++;( J( Y& y* B; x, S //} 8 ?8 Z8 j; I5 g( b% L* c3 J: O // 操作数穷举与操作符号穷举联接3 P( o+ o a _; _* B- r, P, E D //if(FormulaNum[num-1] > max) " x9 E5 G* p! F( n. s% `. X( T //{3 Q; [2 `: M8 t // FormulaNum[num-1] = min;4 a' Y5 i1 s$ P! ?9 S4 } // FormulaSym[0]++;/ h+ x4 h6 l9 u2 f6 ?$ Y% p$ [) J //}/ _6 t3 |- G8 u, z : e* I( t7 @* T% P // 不允许数字重复的穷举# l, \! ?0 g5 w( U) D // 数字必须从小到大的排列,防止重复 7 j6 Z* X7 [0 X3 a" | if((max - min)< num) exit(0); // 出错 . F9 J& k$ E+ C% o. x- ^ 7 J5 k2 I S* I if(EnumArray(FormulaNum,min,max,num)) ' p1 O$ P$ u* U; q { 3 {2 Q. h) ?/ L FormulaSym[0]++;' p) j9 W9 @# l6 }2 L+ d InitArray(FormulaNum,min,max,num);- f0 }. a; k E( t+ {4 m1 z q FormulaNum[num-1]++;1 r- y' {& J' m. x. ^ }& A& A/ |) r; u/ \ 8 Y6 }- d2 I3 k9 O) K/ V* @ // 操作符号穷举- H5 r `4 b A$ A" r3 A for(i=0;FormulaSym > 4 && i/ W$ m, F1 Z7 S! W, Z" Y$ T, V) Q { * U! X8 d# h! }0 d% |9 M FormulaSym = 1;" C3 c+ Y. ~# L1 G, G FormulaSym[i+1]++; m- x& u' s$ i4 N/ `" p9 q% |: ~ } 4 V, s) X& E7 T: h0 m1 N" U/ S; T, ~7 {8 [ } " K7 f7 p7 e( m* R //释放空间; f% S7 ~, B( g j& H7 V free(FormulaNum); 8 w6 y, t/ b' N/ c* N! [: V" [ free(FormulaSym);6 Q. {6 f8 e" z5 } return result;& W, D* s4 B% [. h, ~) E } M# \$ E o- A( e) t // 计算算式结果! }0 [. O7 s( A0 e1 b, ^ double GetFormulaVal(int *Num,int *Sym,int count) V: L+ Y8 O' g2 b" C5 ]3 @! D& L! ~{) K. \/ m% k. u! N int i,j; 5 R% R K2 W6 R8 P: c$ D double preresult;: Q! g& t3 K+ n4 X8 b+ M2 p3 m# P5 ] preresult = Num[0];- t0 E9 z$ V0 Q+ @ ~ i=1;j=0;8 l: T3 |2 c) J5 ^ while(i* s! O4 `9 B# C' S {) e; d3 b1 g4 _; S- f+ l+ A switch(Sym[j])& J& z, O. X1 W/ E% { { 4 m6 i- ~( z- k3 A; t9 g case 1: 6 n) r* T6 a7 F! G$ N- [8 x3 { preresult += Num; ( Q" X8 T1 e- G d break; ; B# p4 ~; f. z' Y case 2: $ P3 x+ W; H# B7 O preresult -= Num; ' a3 K0 k7 Z, F" w1 O3 x break; : E3 H% s2 \5 ~/ }- r' s. e' i case 3:5 e: \4 X1 o4 F# U' l$ Q1 x preresult *= Num;7 [% ]* f }2 r: V5 i break;* r7 J# t9 g% y! N, b, u2 n case 4: 3 k0 ^0 V3 a8 y5 [ if(Num == 0) return -1000; . z. d; Y' a5 x- A' E preresult /= Num; * U4 x O/ R, B break; % k! v7 \3 {% t: y. w" { } 3 Q5 E) b! n- q4 b. G5 v: {) v5 s i++;j++;; B% P) s T- u9 O# g9 o } : X; ?! | ~* D0 L ^! B7 L# w return preresult; //进行修正 " ]9 ?7 } p! X- ?( G! x+ [$ m}' W" Q# L# i" y) G3 M( Q // 打印算式8 A* f; a0 F: g7 n! K void ShowFormula(int *Num,int *Sym,int count,int sum)& ]5 {& ^( T8 i/ Z9 e3 D { ) l% m1 b7 t4 V 1 Q" b0 r& X) u4 G$ Y" u3 b int i,j,len;% f' d/ A U: d4 m/ z5 E- n char *Formula = (char*)calloc(count*4,sizeof(char));5 r0 @$ K& v) c' [6 o char temp[10];8 I; P- L. Z- n0 m6 y# s" \& n5 e itoa(Num[0],Formula,10); & _; N0 ^) a) D1 y5 I. s i=1;j=0; : D1 r$ }& |4 s- K$ c# q while(i% P7 C( H# J# L# Q {7 h- j, W/ t2 W. }9 o$ U$ y. g itoa(Num,temp,10);! j' ^. {+ o4 |3 s len = strlen(Formula); / n4 M4 r# ]" e D6 p switch(Sym[j]) 5 J" r: \ _. `; U { + }* Q( f4 N9 z( [ case 1:8 Q0 K8 y8 _$ P% J2 i4 L6 D case 2:& G4 O: k4 Y4 w0 q' |# q Formula[len] = cSym[Sym[j]]; - Q3 l j5 O; E+ \! r+ s strcat(Formula,temp); 6 E+ T, f) m6 e& |1 i4 ? break;9 r. F; d m1 o9 |: W6 }2 j1 t case 3:7 I/ S3 T& }) v3 x4 I' p( p case 4:6 L& _5 j" {% p' `- a9 \ - m4 e: M2 f, k; F& z // 如果上一个操作符号优先级低于当前的,应加上括号* f7 Z* v9 T6 P1 S8 s. a if(j==0 || Sym[j-1] > 2) * u1 Y; Y: G3 z& p& q4 x9 B2 d { 6 \" H# P9 r: X Formula[len] = cSym[Sym[j]];! ^' G8 ?& T, F7 y& L# b strcat(Formula,temp); ) X8 p9 d! S* ^# F, ~7 ~' B }/ a3 G$ Q( d/ A else : T; j8 i* M# P2 i& s7 k {& ^ u1 T1 F n7 F int n; * ]# ]- G5 v( G8 ^. M% N6 x7 g char *FormulaTemp = (char*)calloc(len+1,sizeof(char)); ' a4 }+ @1 S. P0 l7 S* O for(n=0;n3 {* O. N( z" O2 l {' K9 z6 y$ M' ?8 j! n# Z FormulaTemp[n] = Formula[n];- y6 ]/ @/ I' k8 V% A# p1 t Formula[n] = 0; , L, R1 k/ n8 i5 f$ A3 N$ O }4 n% W' g2 k# A7 `! ]* t Formula[0] = '('; " V) j/ g4 k5 a0 b8 X. H, { N) M6 F strcat(Formula,FormulaTemp); * E9 a! }0 \3 I+ B+ D4 x free(FormulaTemp);2 Q* u, O8 J# ^' {: ~( U: A7 ? Formula[len+1] =')';' ?# f, P* ^8 N" c# a1 H$ K Formula[len+2] = cSym[Sym[j]]; # d3 q1 r* S& f i2 H& ]+ ^1 q strcat(Formula,temp); # E# E$ b2 c7 S6 i$ `0 t7 ]9 x9 k } [+ b9 d4 h n/ ^) Q9 \ break; 8 V" i1 H. W6 _. W+ ~$ h }0 T( A" d6 W+ L! L2 _6 c0 W# x4 ]9 K i++;j++; # r7 ?" T# n- x: ^+ s' p0 M9 s }5 ?# ~0 q- g' B+ u0 P9 Y6 G printf("%s",Formula);) S) F1 Y5 p" }# L+ |: l printf("=%d\n",sum);+ \3 p& g" }& ]7 a% X free(Formula); ; x5 j M# ~' f# k5 e2 b} 6 w, y$ U: L; I: N3 h @) a8 m" L8 N9 Q4 ^- U4 e% I" J // 以当前数组为基础得到一个从小到大排列的数组 * f; l( j- w2 l& B- y% m" E& v: u0 P// 返回非0表示穷举结束 % }4 k) h6 n9 l4 w; S- eint EnumArray(int *Num,int min,int max,int count) N/ \4 F9 u( y7 n8 F: N5 O {, e8 g" K8 ^1 }2 D% a4 | int i,top;6 L! A( `. t/ Z# m1 A$ d2 k# e2 K top = count-1;* I8 g7 r$ k) t! e$ _; ?/ V. A5 M4 u/ p Num[top]++; # g) }) |9 X5 n& K6 ^) U& g) y+ T while(Num[top]>max-count+top+1 && top>=0)1 a. N5 j2 d# b1 {8 E1 u, w$ w) s { ( f- B# Q& Z, q" v# q4 i top--; $ A Q0 j' D- Z- \! R3 i/ i0 h: N" w Num[top]++;, @0 K5 g# K( H } 6 c2 d- H5 v: R1 e& n# d7 K for(i=top+1;i3 J- U# ]. p+ l/ V { 7 h! u) g4 o" @, ~9 W* O2 a$ { Num = Num[i-1]+1;3 A# w+ y/ q" {7 G5 W3 V }; O/ f" Z" _2 ?* s* ?- C* V, M) ] if(Num[count-1] > max) return 1; 7 i4 E8 p" e+ S( S) x! ? else return 0;0 G7 ~7 L! k' [( F9 Q }5 ]4 E9 |2 G( X . N+ ?& O6 p; Z2 U) l: m // 不允许重复的初始化数组 - k: }4 G9 Z) K. svoid InitArray(int *Num,int min,int max,int count) 6 w, b1 W1 J/ P7 V. }{ * k+ ~% v: s$ e+ O+ q" _$ ^! E int i; : g% {4 G2 R( n1 y for(i=0;i=min+i; 7 h l/ v3 Y& |' r Num[count-1]--;, G6 U2 q! u5 @3 H) F8 \: J }) m* O% J# I- g- Y; Y$ Z4 V 4 b3 C4 f; {) z4 K / g# R0 w. E: y( T6 g/ j! f% D' d5 n$ a% g# q 7 e- o+ j' A# R; ~( ?+ b; u
    [此贴子已经被作者于2004-5-2 14:50:47编辑过]
    6 V, v; }+ Z/ L( O3 P0 Y2 P# U0 F

    该用户从未签到

    11
    发表于 2004-5-2 14:54:00 | 只看该作者
    本法穷举出所有用min - max之间的num个数组成算式,结果为sum的情况/ K) M$ Q' d, t  a3 p6 N2 G

    3 K2 J% `( x+ W- F" s( \, Y3 r" p如要具体的话,可以不穷举操作数,直接输入操作数,进行操作符号穷举
  • TA的每日心情
    奋斗
    2015-9-17 00:58
  • 签到天数: 1 天

    [LV.1]初来乍到

    12
    发表于 2004-5-2 15:17:00 | 只看该作者
    以下是引用游侠无极限在2004-5-2 14:41:26的发言:9 d: ~& |" I6 b! O0 w #include . c$ @5 V% p- u5 P4 v- }9 X& t #include 5 X" `' i1 G- f1 |1 [& w) S 6 s$ H. u4 O+ Q9 ]( B# [ int EnumFormula(int min,int max,int num,int sum);" b' l+ j& N4 J- B S void ShowFormula(int *Num,int *Sym,int count,int sum);+ D' B2 b6 i# u7 z) g! @$ k double GetFormulaVal(int *Num,int *Sym,int count); & @: x8 M: M" c1 y _$ B2 A+ w; e int EnumArray(int *Num,int min,int max,int count); 3 v" A7 e0 P# _7 D0 G3 g void InitArray(int *Num,int min,int max,int count); 3 g* k. [. R9 S. R6 l const char cSym[5] = {0,'+','-','*','/'};9 S# e8 B/ D/ ~) Y $ \8 o: m$ ^2 ?: P' L! W int main(int argc, char *argv[])$ B$ p$ X! d. q$ E {0 m/ }% P9 Q5 Q: A- ` printf("总计%d个式子\n",EnumFormula(1,10,4,24));. j! c, x9 Y5 U/ z/ C system("AUSE"); " }5 I6 y9 V* m& U9 \ return 0;% |; x0 ]& a& Z( x* m+ A } & {1 i$ W; P% U! e! \- d' I0 i* a! t, \8 I int EnumFormula(int min,int max,int num,int sum)7 G7 h* s& l$ q% r- U- `( z' f( p {7 |: q2 `- e5 r8 J int *FormulaNum = (int*)calloc(num,sizeof(int)); //储存操作数 % s) H. y" d9 B! Q; W //储存操作符号7 f l9 ^$ X3 a: R" r //最后一位用于穷举结束标记0 m* `9 g$ P& n9 D3 ~ // 1 - 4 代表 '+' '-' '*' '/', [5 u# b, n% j, X: G8 g2 B, a int *FormulaSym = (int*)calloc(num,sizeof(int));3 W! S+ B g6 c l* ] 9 D) i- D$ N1 g5 P6 m' [2 T5 N int result = 0;8 O) Q) j" u2 L // 初始化操作数和操作符号数组" K3 q$ j, [. H: J & N2 l: J1 v+ p/ N5 F. x1 R int i; ' t+ D3 K; ^! z4 h+ v1 ]: A4 U9 t# T for(i=0;i = min; ! F& b5 {$ M, H2 Z: V# o for(i=0;i = 1; S3 |* E* E% A- z; V- C% t FormulaNum[0]--; 1 n" s0 z6 \0 C; e4 q8 J ' B$ S2 [" z% c7 w! h8 o InitArray(FormulaNum,min,max,num); , h" L( F! n3 e" |, C FormulaNum[num-1]++;( U1 @: J0 u6 R s% C a; x, A // 穷举操作数和操作符号组合 ( S6 S; Q' n5 V% E& \: o4 D6 ^$ h while(FormulaSym[num-1] == 1)/ J: u) A2 U5 v5 {( {: r { 8 K9 u8 l* A1 B$ y# i) e double t = GetFormulaVal(FormulaNum,FormulaSym,num) - sum;8 {+ O% u8 A6 Y' W( N% I% f& T" t! I if(t>-0.01 && t<0.01)3 o+ O- B: B2 Z0 @ { $ P! S: V7 ]+ W- \2 u b //printf("%d %d %d %d | %d %d %d ",FormulaNum[0],FormulaNum[1], * G/ p6 D: I+ @ //FormulaNum[2],FormulaNum[3], / p" |# ~0 }2 i2 H5 G // FormulaSym[0],FormulaSym[1], - C' m! `$ H- x1 `1 x& X0 e. i8 U // FormulaSym[2],FormulaSym[3]);! t$ Y* A: U$ @% P" `6 E ShowFormula(FormulaNum,FormulaSym,num,sum); ( ]; d0 |% C( S% v& C result++;, V: }5 t- P% k5 n5 U. L }# c) i. ~* d4 ~( @$ O6 h. b6 N 4 O4 e$ h& ^ n, I x7 F1 A* i // 依次穷举操作数+ H" e d0 P2 _: c. Y( { . B! u. z. Q" C3 \7 U6 o //允许数字重复的穷举5 i3 }0 z( q% {+ l$ @* X //FormulaNum[0]++;( C$ o# C- ^% w3 B. S //for(i=0;FormulaNum > max && i 5 ~5 {, T; N0 H6 V6 g( O //{ 2 X; O' p. e1 @; D // FormulaNum = min;9 j( [& f# u$ n2 K+ {. l" z // FormulaNum[i+1]++; * f2 e \! V' t- G% L$ ]% G //} * P/ j# t3 @! }0 u // 操作数穷举与操作符号穷举联接6 r" Y* U- M* _; f( k' q+ _ //if(FormulaNum[num-1] > max) : ]3 O6 w9 A2 r! U# G0 {" j //{ i! P6 k' n) c6 ]. K* G! V // FormulaNum[num-1] = min;% o4 n4 J6 L" ~ // FormulaSym[0]++; 7 |# G: N" h6 J* x0 Z //}+ X5 Y& f& f( y9 G 8 V3 b3 u+ Z+ | // 不允许数字重复的穷举( w8 a+ @$ Z8 S( ] // 数字必须从小到大的排列,防止重复 * L& N& P2 `$ j( I: B A7 ~ if((max - min)< num) exit(0); // 出错6 z+ S( c" }' \8 n # _# c" ?7 I8 \7 E9 E if(EnumArray(FormulaNum,min,max,num)) * L+ R6 J5 w5 z( O: s! } { ) F0 t; g4 L" w FormulaSym[0]++; / H& i; j; h( d: j InitArray(FormulaNum,min,max,num); 3 |( U# v( r6 S6 w8 {. Z( q5 d FormulaNum[num-1]++; . h ]8 k% l6 R# _* ^% z; L } k M: @0 f7 @7 q , t# H* }7 o; C- P // 操作符号穷举 N" ?% s* X1 ~$ |) p" j for(i=0;FormulaSym > 4 && i5 [# B, ^1 L' Q { & T9 R$ M }# _/ N/ e! j( L FormulaSym = 1; : Z3 V7 _3 t+ L1 t& j5 s FormulaSym[i+1]++; . D" K# H1 t/ A } ; C- X5 }5 ~/ a! v$ v$ [' Z" x" U, G/ | ! u6 J& E6 t9 [ }5 \! |! }" B2 _ //释放空间/ P1 F3 D2 u( L) c free(FormulaNum); 0 r, j, n3 u! U9 y( O$ |& q0 Q free(FormulaSym); 7 P( \% Q* Q1 }, |, I/ |! X( Z6 U return result; ( [' G& T: d3 |6 r4 [6 t; g }: E6 u- L& G" X' ~ // 计算算式结果; }- J2 G4 v' O4 D! D5 f* E double GetFormulaVal(int *Num,int *Sym,int count)( A) u, W# v7 T. m8 c { ; f& v2 x- t% e int i,j;; K6 o) ], a, ]' U/ `. N0 w A double preresult;5 v* c5 j' G8 u preresult = Num[0]; * [8 V/ s" v/ J: p+ I; B8 k i=1;j=0; / U6 a+ M' C6 e4 h; T; ~0 I* V3 k while(i. p7 o8 L: ^: [8 z9 v {2 r' R1 i0 X* l& f# \ switch(Sym[j]) 7 l n$ j7 Y, Y3 w$ F) b {, T1 J- e7 {+ P2 [; x) [0 J case 1:4 N% D6 J( B3 h5 O/ l; E+ Y preresult += Num; ( G1 C7 ?% c* H9 W" t break;" q1 C3 u- U; p2 Z0 K0 ?1 _ case 2:+ v. i) D6 R5 Y K preresult -= Num;* \/ w$ \: C& G break;5 [9 k r; k: J' k8 ^+ c case 3:& _0 a* a2 B2 F2 y! l& \1 E' Y preresult *= Num; 6 U- X3 d; D, @& X5 t% G1 [ break; 2 Q- t% F) K/ u: n6 ?/ o5 ^ case 4:" d; B) c( B: @; p2 X. K if(Num == 0) return -1000; # D* B g4 P. f, o2 ~* ^; h1 | preresult /= Num; 7 s4 U" \ ~* ^3 S+ x( i3 D. _8 K break; % _3 z3 N2 e+ C( A% e! r& y }! W9 C# a1 `) o' h7 g& }+ D i++;j++; % i& I/ C. g- L* A/ K' \( R, x } & B2 W2 j! r. r1 l* ? return preresult; //进行修正 9 D) J6 a8 S7 E/ [ } : w) z/ L2 v& M& w // 打印算式$ n3 A& f+ ]1 [ void ShowFormula(int *Num,int *Sym,int count,int sum) f, v$ l, }; m& F0 `, y# l {( T1 ~) ~4 X8 M# C& Y( I ; Q+ e+ F' T' G- ^% { int i,j,len;# K' z u6 X) U4 |3 x9 N% ~ char *Formula = (char*)calloc(count*4,sizeof(char)); + v/ K# {3 T& b9 `, W% O( [3 ` char temp[10]; 1 d* @9 L! @2 Y& I* O" d1 b itoa(Num[0],Formula,10); / T% W# w" j8 d- ^! t$ G i=1;j=0; / w+ o( O( c( y while(i1 F2 v7 P1 o' f3 \- {1 s# i { , H6 A) q' O* g8 D" [4 d itoa(Num,temp,10);7 n9 j# d# c/ [& j4 C len = strlen(Formula);: Z" H; ]# Z2 [& M: U# r$ C6 h switch(Sym[j])$ w8 B4 t8 y% K% ]7 b5 E; z$ u {0 v/ a1 L$ S4 x4 B d" G! m case 1:. n, t; E7 y0 L& S case 2:. {' w8 L% J7 G7 g9 n8 U) |2 P$ ] Formula[len] = cSym[Sym[j]]; - R: ^; z' K Y$ b& m; f strcat(Formula,temp); 4 h' I1 W* f! G break; 0 C( j; A# `* o) G# b+ n* F case 3:4 f- D) |1 ^" P* a case 4:/ L8 [. w( X! }" Y% k9 | 2 M3 L* R& C; W7 t; ~7 n5 P // 如果上一个操作符号优先级低于当前的,应加上括号 0 b# d* }; Z# ?5 F. V, | if(j==0 || Sym[j-1] > 2)7 o( Q1 I9 k6 V4 y { , H4 O2 i1 A/ ~. t" p: e$ S$ P Formula[len] = cSym[Sym[j]]; $ _, m* U; J) i strcat(Formula,temp); & w) ?) f% \ a! h } " I! _0 x% L' ^; S5 E6 s else& Z% ~) ?/ Q" y' |) }# I) g P4 p { . P5 H, E9 R' \, Z* T, P3 k9 O int n;7 I* ?3 W" S7 S0 H0 l5 g0 K; Z char *FormulaTemp = (char*)calloc(len+1,sizeof(char));" w8 u- F- b/ }; S for(n=0;n# a& k/ N( o, v0 r- C# G9 ^ {3 e8 W& I. F% E8 b8 b! k' K FormulaTemp[n] = Formula[n];6 s' [" W. O( F- I( L" l( G1 I9 Q Formula[n] = 0; ( L0 A2 Y; {* h( R }4 T( a- K6 A% s, `- U( H Formula[0] = '('; : E( c. P! H: e* Y9 e9 }% g strcat(Formula,FormulaTemp); ! r4 v. z, y$ v: ^ free(FormulaTemp); % M$ U v7 s* b0 _ Formula[len+1] =')';& E7 L! H& H5 N. J6 h Formula[len+2] = cSym[Sym[j]]; + c9 ~/ t a* I, V strcat(Formula,temp);/ _9 q( W7 B. d/ s5 G* f } & h m* O$ B) C) p9 L- ? break;% F8 f; M5 u6 b, t }4 s/ T+ `# \/ o8 ?4 z i++;j++; & p3 Z3 _: Z$ V" K5 {( ] }% E! Y& f: Q) d) w printf("%s",Formula);4 @3 h x( a- O. J* S, w printf("=%d\n",sum);0 i+ `1 E6 K6 d. V$ ~ free(Formula); 0 g2 l% A% S U+ {2 ` }1 t# ^0 L( S( m4 H. @! s& ~) [; ] 0 P; i5 k7 y- Z+ e0 E: z" i( }* J Z // 以当前数组为基础得到一个从小到大排列的数组 1 c0 ^, N/ r& C% ?3 @/ u, x4 h // 返回非0表示穷举结束 . j" F. T. V2 O$ A! H$ @ int EnumArray(int *Num,int min,int max,int count)* b6 V9 C9 k' H' F# Y6 A4 j; T$ Y { 3 l: B2 t/ Y& O) E int i,top; . {. h$ s: m# ^5 T( x' u top = count-1;. Z- g* N4 H5 q& S: E Num[top]++; 8 Q3 L9 ]+ s6 M' U, Q while(Num[top]>max-count+top+1 && top>=0)& X- {6 c' Q6 B$ i/ {0 D, C { x* i% t. \( u- W& R top--;: N7 H }2 n' c0 Q: I0 S Num[top]++; ; `3 W% s, A3 B9 { }0 D) l/ R8 o* r7 \! I% \ for(i=top+1;i! I% @9 j$ W) q+ ], O { ; c+ I# `2 z& E2 t Num = Num[i-1]+1; 2 X* N _( p: o } % N; u, Y5 `; F if(Num[count-1] > max) return 1;& R k: G) C, m else return 0; 4 I" a3 m) [$ a/ V8 I, K; z% n( K }: ~) q" \* [; [) M& i: s5 r ; N; W7 z0 q; U# c! j U7 n/ z2 d" F // 不允许重复的初始化数组 . g) n! J5 g" ^# S" u3 J( S; X void InitArray(int *Num,int min,int max,int count) , a! f% \5 J( M {' u; N: b. M- ^- @ L3 e. ~" e int i;2 A! I* P1 M0 W3 u7 m; X0 a, M for(i=0;i=min+i;# a2 l5 g5 e, l Num[count-1]--; * N5 g" B7 S7 X1 B: k; ^! j }: A7 a6 z+ _8 P- C/ _# c* G - n, L% I4 E! l/ u% t . R: z. E. I7 E& E! e* u a. z# N, g* L' B - d1 r1 u# Q' ?9 Z H1 y5 ]3 K! u# o
    [此贴子已经被作者于2004-5-2 14:50:47编辑过]
    0 ?4 [4 M4 \# m. `6 ]3 {9 ~ 8 U u# P4 I) |1 b& Cprintf("总计%d个式子\n",EnumFormula(1,10,4,24)); 的运行结果是: # V2 T$ F2 [6 o) B) {1+4+9+10=24 / ~- T2 p4 |$ _! u+ p9 v9 @1+5+8+10=240 ^$ v/ K. @# s8 [/ n 1+6+7+10=24 % f0 ~- {0 \1 O. m. Y8 ^1+6+8+9=24 3 n: n/ ~! Q" Q2+3+9+10=24 ; \" J6 t! }% C8 P! Q2+4+8+10=244 l( @* J8 Q' ~- w; F 2+5+7+10=247 l0 K# [# | F* F% L* s9 ?" s5 m 2+5+8+9=24 / w! C8 q2 I/ y7 [3 l4 y1 ]. e" `+ f2+6+7+9=24( Q4 u9 E" t1 f2 A& f 3+4+7+10=24 # |( i. h$ O' m0 _2 S V1 i/ z3+4+8+9=249 Z% ], y5 R/ |: T8 v6 J% Z4 \ 3+5+6+10=24 * k b" B3 m' t# X$ c3 @+ Q3+5+7+9=24 P3 P/ X) ^) |7 X 3+6+7+8=24 ( ?) S. D2 j6 m! s( r8 |4+5+6+9=24 ) _* f/ H/ t+ u% t4+5+7+8=24; P( D. N3 Z* N& o; S 这是什么意思?似乎是找出了 1 至 10 之间的和是24 的数据,这和完成计算24点,差很多吧? : l. M. ?% c5 r w( O8 k比如用户输入 2 ,5,7,8 程序应该能得到计算这四个数据得到24的表达式才行啊,这样就可以写一个游戏了。+ _; t5 q g5 L# i+ x- D 如: 1,5,7,8 有如下方法可以算出 24( e: J3 J# L( ]0 G: r ((1+7)-5)*8 = 24 , I; F5 g% X' E5 A0 p' P. R((7+1)-5)*8 = 24; N1 q) H/ m7 m4 q4 @! i* w( ~5 n+ J (1+7)*(8-5) = 24 7 z: S7 P* Z% f(7+1)*(8-5) = 24 . @# E0 r$ Y) A/ r# k((1-5)+7)*8 = 24 1 @: O- I6 p) i3 X# t( v. x((7-5)+1)*8 = 24 ( O% ~3 C- k, G6 ` A. ]% R( ` h+ g(8-5)*(1+7) = 24 ) a6 i) R1 I% B4 g; E2 J(8-5)*(7+1) = 24 $ L4 d& Z. C3 D5 r2 D1 {) t& k8*(1+7-5) = 24 4 b* |$ | B4 K `5 n8*((1+7)-5) = 24 * t* m3 N# C: _ {9 _% q' n/ y8*(1+(7-5)) = 24 7 G9 p. K( S1 y% v5 G. ~2 |8*(7+1-5) = 242 \* V4 A+ P4 ?: ?& w 8*((7+1)-5) = 24 % c" T2 \! b9 `& m' L+ j1 e4 b3 R8*(7+(1-5)) = 249 `1 a* Y! ^1 g4 P& _ 8*(1-5+7) = 24- X f2 w: X0 c3 T* m1 a 8*((1-5)+7) = 24 7 F, s; x. a* ^; q$ k# |8*(7-5+1) = 24 9 _. _7 |2 c6 t( [% d3 r8*((7-5)+1) = 240 R" d) B, r0 s: ]/ {

    该用户从未签到

    13
    发表于 2004-5-2 15:21:00 | 只看该作者
    结果是这样的:
    + c5 ^  O9 k& L' G7 o1+4+9+10=24
    - n+ i6 I& h" P1+5+8+10=24
    , \% ]* n, }3 i1+6+7+10=246 u: J1 h- K/ l9 c
    1+6+8+9=24& e$ {7 ?  z0 r: J1 i( i
    2+3+9+10=24) \. r# T2 [0 t8 n# i2 ?4 c3 I
    2+4+8+10=24
    ; ~) p$ T% p) p4 c; W2+5+7+10=24
    " B: _8 g+ F+ S: h" B! U2+5+8+9=24+ F1 u7 E# h" Z6 f$ k
    2+6+7+9=24
    3 h) p# R/ a" p3 m, V% C9 W5 J3+4+7+10=24
    . |/ z2 H5 Z7 |& L' S. b3+4+8+9=24# k5 H8 W$ z! H  |6 V- U
    3+5+6+10=24$ A4 O9 v: S: m; x* @
    3+5+7+9=24+ U, Y8 m, i# t  {
    3+6+7+8=24
      K- o( m) Q+ R  Q. p4+5+6+9=24
    ! V# f( U0 V* Z" [2 W* t4 y) L4+5+7+8=24
    $ \2 E* |+ \+ N, u8 x! P. {1*5+9+10=24
    ( I  Q7 Z8 P! h5 R* T6 b1*6+8+10=248 H" Y# y; t2 J4 h  K5 N
    1*7+8+9=24- C% d! s8 l- r: s
    2*3+8+10=24
    2 G) i: m+ @. D) Y, [! x2*4+6+10=24
    - t* T2 b  p: J% X  n2 S6 P2*4+7+9=24
    4 y" }# I. X: j2*5+6+8=247 Y( o4 F9 k  d$ `) E. m
    3*4+5+7=24" M8 I" p; o; c' k, j0 v4 Z
    4*5-6+10=24
    7 @1 E' ~6 ]1 h& {5 r7 C# k6 E(1+2)*5+9=24: w( X, x" g- d8 f7 {+ |+ y
    (1+3)*4+8=24
    : b; V0 x" d" t2 y1*2*7+10=24
    6 K0 n4 f6 O" Z& {2 k1*3*5+9=24
    # s2 U# _; y- U& G* H6*7-8-10=24
    # Q4 V; a9 c1 k4 r4 Q1 _(2+4)*5-6=240 D! S4 T, P! z( N5 J0 K0 f
    2*3*5-6=24
    ; u1 M+ c- }% K( ]9 X. |(1+2+3)*4=24
    2 \1 z* E( V# \+ Z(1-2+4)*8=24
    - P8 S: Z: u7 q(1-2+5)*6=24! p9 |; L* |7 a; ]  L+ n
    (1-3+5)*8=24
    ! U. q1 `% Q& U(1-4+6)*8=24
    ! I% C) q6 ~! |* h4 F: H' x(1-5+7)*8=240 b7 O. o0 B9 d  H0 {+ s! ?+ L
    (2-3+4)*8=24
    4 a6 |+ h, \) k7 c! F(2-3+5)*6=24+ [6 A8 l1 ~8 v* ?
    (2-4+5)*8=24
    . R3 c3 a# W1 m8 d7 X" T, a(2-5+6)*8=24$ z9 N. @2 G5 R* }# V2 ?" V
    (2-6+7)*8=24
    : I. d3 _/ ^* n2 D: i1 q(3-4+5)*6=24
    8 k1 O3 U. T( B0 H; s(4+5-6)*8=24
    & N/ c% r) q; O, k(4+6-7)*8=248 q2 }$ K8 n' |* h! b3 i6 t5 M/ W
    (2*4-5)*8=24
    + ]& G1 H' T5 h  ^" _4 r(2*5-7)*8=24/ e9 R6 i1 _- w- h+ B; m& L
    1*2*3*4=24
    # P+ K& L8 m  _+ ]4 E1/2*6*8=24! J5 S, v; t& u. `" V: S  g7 D. e
    1/3*8*9=24  m9 Z7 I( G, H4 w+ k
    2/3*4*9=24% D9 `0 [2 q' `8 Q. Q# e
    2/4*6*8=24- w( l4 c+ A; t6 }8 j
    2/5*6*10=24
    7 F$ X& ^+ y$ f! t$ P3 c! D2/6*8*9=24
    + K' A- K% w% b' b7 P  ^3*4/5*10=24
    ' L( W* n7 d- l! j! c# Q5*6*8/10=24
    6 ^$ ?& {' W+ K$ \% L2 v9 Q/ k9 [总计57个式子

    该用户从未签到

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

    [LV.1]初来乍到

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

    [LV.1]初来乍到

    16
    发表于 2004-5-2 15:28:00 | 只看该作者
    (2-1)*3*8 这个算式你就没有啊,这4个数字的组合都没有出现: j8 X+ S: L& P1 _7 L

    7 p; V9 [( D' M4 S- t: m2 v* Z" z' |9 _8 m& {

    3 ~5 X  w$ R. H! D% O6 _
    ! N, T- [( U3 `9 V2 Q
    4 b5 ?* Z2 S, c& c9 I0 `; s
    : ]  w. ^0 \' F0 w1 e8 w
    [此贴子已经被作者于2004-5-2 15:32:12编辑过]
    + h$ x9 w. T# d+ I
  • 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 | 只看该作者

    2 p2 a0 V5 L/ c. ?: L9 t" z) o, B4 b# |9 E8 a* W
    用这个好了,只不过输入的时候要按从小到大
    - ?5 }  z, k: T+ ]$ G1 E1 f* |8 S
    7 H7 k4 @0 z9 p8 y& e" R. @好象有BUG,我暂时不太清楚

    该用户从未签到

    20
    发表于 2004-5-2 15:38:00 | 只看该作者
    以下是引用yzhlinux在2004-5-2 15:28:15的发言:
    7 T0 l. i3 m/ R% f3 X# N  f# N(2-1)*3*8 这个算式你就没有啊,这4个数字的组合都没有出现
    0 |5 o7 D" w+ W4 U3 p0 r

    9 H7 B6 ~  B+ E  G本来为了防止诸如
    2 t2 P- M) D  V* \7 T& m1*2*3*49 H& s/ `* w+ l+ L8 u  [
    1*3*4*2/ R! Y. h7 h8 N9 L3 x6 f1 L
    2*3*4*1+ z7 M- b$ o( ^3 ^. E3 [
    等的重复,只使用了从小到大的数组,不过这样好象也丢了不少可行的式子
    $ H0 u( B, J- t/ R0 ^" f
      B- D& f+ B+ ~$ N另外你的程序就是有这些重复的& F4 e! q5 M0 a* L  B

    : N$ U& }: P: Q! L9 u0 yPS:VB的程序感觉就是慢好多啊) R! h: n5 X/ a! d
    [此贴子已经被作者于2004-5-2 15:42:01编辑过]
    7 _* e3 d2 E  @0 D  a; J

    本版积分规则

    关闭

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

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