下沙论坛

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

QQ登录

QQ登录

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

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

[复制链接]

该用户从未签到

跳转到指定楼层
1
发表于 2004-4-27 17:53:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
就是扑克里的24点游戏,4个数,+-*/得24……
1 B/ s0 U' L" k1 W& A8 f# D/ {# n5 V: o, n) i
偶还在想……
分享到:  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 k' @: b7 ^/ p3 T
    穷举法吧

    % A  _# F' \$ P' `那你的代码要写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 则表达试就是我们要求的了。比如:
    ( ^& v) P8 Q1 s, R0 wfunction GetMach(A,B,C,D) as String       '得到一个字符串组合如:(A+B*D)-C4 `& Z" F( s9 ^2 \& {+ ]
    function GetValue(MachString) as Float    '得到字符串的计算值 ,可能是小数
    , W2 V8 b7 J' t5 i那么程序就好写了:: y. J& `7 ?: u% F) l
    GetNumber(&A,&B,&C,&D) ;    '得到ABCD则四个数字,赋给A,B,C,D四个变量1 y5 z  C4 s( p6 f
    do{
    7 Y7 s$ z, o$ A& e- N  MachString = GetMach(A,B,C,D); '得到一个表达试的字符传
    7 t* i% @4 ]" g+ ^: l# w3 }  if(GetValue(MachString)==24) break;  @4 K6 o0 ]9 p2 v( A( q
    }4 E5 z, V7 a6 D7 f
    print XXXXXX;
    4 r) z! R& N' \) ]/ Q

    该用户从未签到

    7
    发表于 2004-5-2 11:57:00 | 只看该作者
    我现在试着在写,就是不知道有什么好办法解决重复的算式问题,比如" H8 D6 l3 K) k- A' G
    (5-2)*8*1
    ! ~( ~5 L' R8 n5 G6 s2 v" w8 E1 j# W3 O1 b6 o$ a
    (5-2)*1*8
    / }  M7 Y( J4 f8*(5-2)*15 ~" p2 h* }' w1 n9 }$ l3 S
    等等
  • TA的每日心情
    奋斗
    2015-9-17 00:58
  • 签到天数: 1 天

    [LV.1]初来乍到

    8
    发表于 2004-5-2 13:17:00 | 只看该作者
    % \, p+ o( Z: v1 S

    / Z1 T, B- r& M* W花了一个上午,终于完成了
    : T5 o7 s( ]0 Y你参考参考吧,哈哈
    1 o+ h3 y5 P  c8 E7 j) ?/ q! f3 |$ P: {
    * {9 C0 t& P$ z- w- \; Y4 Q7 ]
    [此贴子已经被作者于2004-5-2 13:43:13编辑过]
    / p" j+ k& L" y4 j) n: X/ m
  • TA的每日心情
    奋斗
    2015-9-17 00:58
  • 签到天数: 1 天

    [LV.1]初来乍到

    9
    发表于 2004-5-2 13:42:00 | 只看该作者
    上面的发现有一点bug,$ W" |* d. A4 Z& E& @
    这个改过了
    ) R1 t1 P, W. B9 S6 p* }: }8 Q一个计算 24 点的小游戏
    ; I, c5 L* K/ x9 K3 l* OVB 编写! G  W- @; \: L+ _# w

    1 Z4 u3 b, u6 j* k8 f5 _2 Q+ b
    / m) U9 E$ Z! V
    [此贴子已经被作者于2004-5-2 15:17:46编辑过]

    $ P! `8 Z; C5 h" {( F* m4 A3 d* g; p

    该用户从未签到

    10
    发表于 2004-5-2 14:41:00 | 只看该作者
    #include ' `. U$ \9 n8 D0 H* ^#include " o( N. Z! i5 C5 B5 }. K- c 8 l( o2 U7 V; o, t d. I( Z* I* L int EnumFormula(int min,int max,int num,int sum); & J, b4 |9 Y9 V( Ovoid ShowFormula(int *Num,int *Sym,int count,int sum); $ h/ L/ J; H- mdouble GetFormulaVal(int *Num,int *Sym,int count); , [+ F; B$ }8 |5 [$ l! Sint EnumArray(int *Num,int min,int max,int count); # S, p4 \0 g# F+ H/ F1 }9 F; xvoid InitArray(int *Num,int min,int max,int count); ' ?) x2 C5 F( B4 yconst char cSym[5] = {0,'+','-','*','/'}; [8 q3 Z s; q B; ?- L - ~. a6 s g/ R6 H7 mint main(int argc, char *argv[])) q" r/ m4 L+ `2 F# W { 3 e: x- D; @& {4 Y1 N E printf("总计%d个式子\n",EnumFormula(1,10,4,24)); 8 _$ u, c/ L- _: w9 E D system("PAUSE"); ' R$ w, }2 W p0 M return 0; 8 f4 t; m+ X- l+ ~} K; I+ u$ n3 s3 R+ N 8 c5 Q& o8 r5 O U; c- Y* lint EnumFormula(int min,int max,int num,int sum) t) n! E6 y, U& h" k+ F. q# O { ! C8 s2 @& D& U7 M, A2 A/ T- F7 G9 b int *FormulaNum = (int*)calloc(num,sizeof(int)); //储存操作数: q# g, L1 w& n5 F( e# S- }) N$ X. S //储存操作符号 6 x5 v, \' M, V //最后一位用于穷举结束标记8 J3 w- o* Z6 v& w // 1 - 4 代表 '+' '-' '*' '/'5 N' P- Z' I( h, z7 c$ O/ ?/ ` int *FormulaSym = (int*)calloc(num,sizeof(int));& K" W( W7 S( a, O6 s$ A( j ! w* Z5 [. {; y0 A int result = 0; " |8 N) h' s0 o4 D: n // 初始化操作数和操作符号数组 3 ^! f& P. P( V/ I ( t& O* j* u. u% C int i; / _5 D' X+ G1 C7 O5 u / A& a, K0 }+ K5 X, A5 W for(i=0;i = min;3 k: R/ m$ b: \* K4 M4 j1 T for(i=0;i = 1; 2 X% {( K4 b" T& X8 z" M FormulaNum[0]--;0 K9 t$ D/ m! R8 R/ I 4 s- h9 W) @0 C8 d InitArray(FormulaNum,min,max,num); 3 M2 ?& W& w" p1 H/ y( Y FormulaNum[num-1]++; # ~! Z& @) } m/ N // 穷举操作数和操作符号组合0 `. p5 l) q1 \1 i( ~ while(FormulaSym[num-1] == 1) ! k9 A6 m+ g: l4 ?0 Z {; y$ |+ K! y3 f/ S+ H double t = GetFormulaVal(FormulaNum,FormulaSym,num) - sum; 2 ]2 |4 p- X5 P* w if(t>-0.01 && t<0.01) 3 \+ d9 w z+ u/ | { 4 G4 u& _( ^% C2 b- Z6 c //printf("%d %d %d %d | %d %d %d ",FormulaNum[0],FormulaNum[1],% C1 B' w6 _4 _# R- N* b+ u9 G //FormulaNum[2],FormulaNum[3], " @& c: H8 @# w) {+ L6 D // FormulaSym[0],FormulaSym[1], & q( a) e6 M! Y& b6 X // FormulaSym[2],FormulaSym[3]);+ R- `+ J1 U, c2 ?# z9 c ShowFormula(FormulaNum,FormulaSym,num,sum);. j0 h! j+ O; Z; t result++; 1 `1 c D1 K* C* K0 x } $ ?& c/ Z4 E) V0 `# x8 w U# p# d: W9 }' y' U( z // 依次穷举操作数! R: e4 k3 \' [" u# A% v & ?3 O7 Y3 z1 W0 t R4 w8 _5 v/ q //允许数字重复的穷举9 {4 q L) U2 d: x \+ G //FormulaNum[0]++;0 ]0 v2 | {, M9 m% V //for(i=0;FormulaNum > max && i5 C3 [7 x5 P+ I4 e; K6 P //{ - k4 h; d" [( D+ N9 G- j // FormulaNum = min; 5 ]; D9 g9 {3 v: C# t* k3 U$ w // FormulaNum[i+1]++;! g5 d9 @& C+ K$ h \' ?, L //}+ c& i3 X* W% X3 r" P; d4 e // 操作数穷举与操作符号穷举联接 9 h' [+ C4 U" b7 C* g //if(FormulaNum[num-1] > max) ) p' q1 q) b4 c4 Q7 _ //{ 2 {3 V. ~; _, i- r% ~: o // FormulaNum[num-1] = min;, G$ l1 j! M# ]* u+ O4 a // FormulaSym[0]++; w% b% u, }3 ?+ v //}! }, B3 R: D0 g! `) X 6 I1 v+ O, G% O$ E9 r8 J0 Z // 不允许数字重复的穷举( J# [: G, N/ t, `3 h // 数字必须从小到大的排列,防止重复 8 S; h% w: v; m+ l/ U, X+ c9 b if((max - min)< num) exit(0); // 出错; I+ J1 z1 [% H& A e) f" y& B * X; c7 h3 k, N1 g2 `4 T3 F if(EnumArray(FormulaNum,min,max,num))! x2 `) y: G7 v# g9 Z2 @6 H1 I* ? { 5 s- L9 x1 J2 X- ] FormulaSym[0]++; 6 ]$ j/ t& D% F* j InitArray(FormulaNum,min,max,num); 5 B+ W/ h/ Z" S% C4 B* C& u. p7 t FormulaNum[num-1]++; . Z% e: T, B- V7 u" p }4 ^1 i1 \6 @- p s" x" y ] 1 [7 g/ o6 h% Y // 操作符号穷举 % q! f! u+ V0 e& | for(i=0;FormulaSym > 4 && i& ~7 l' f* U) Z4 c; p {& a% g( h; W; D, _" M! W/ ~0 m FormulaSym = 1; & g0 C) U! t- e: c0 j7 x K+ `8 h FormulaSym[i+1]++; , B5 C C Q T; z' x. ^ } ) K0 D7 {/ l# I0 m' O P4 U ' a; k# j2 G# B6 v } ) Z7 T% \9 C% I. X //释放空间' E' [4 ?7 j3 J5 E8 K; z T free(FormulaNum); / L- ?9 ]0 v0 a+ I3 p free(FormulaSym); & X5 d( b9 `" T return result; 3 \# J% K2 E' w. ^" F}! M0 T8 ^) M; [: `9 J. l // 计算算式结果+ O8 c$ J. J$ R) \ w3 l double GetFormulaVal(int *Num,int *Sym,int count) & B8 _% c% W8 T! T" V% U{ $ F3 e2 @! h4 g int i,j;* F5 X( \7 S9 M) {0 ~ double preresult;5 M0 w. @# [* j4 f' c+ o+ ]+ n o preresult = Num[0];6 {! p* D+ D9 _0 ^$ ^: [% `1 [ i=1;j=0;( R3 j! s/ k/ e/ h) [ while(i5 R( H9 X: \1 D9 x2 b {: F- ~; H) s- L- v6 |% | switch(Sym[j]) % V9 T$ u. x' g1 r: |3 m T9 T. U { 9 n7 x/ ]! } a case 1: 7 G. h9 c6 m! D) k) z preresult += Num; * I# \" E) M4 g# M& V. ?1 `0 ` break;) I8 M$ C) o5 J& h case 2: 6 j4 h p$ d# q preresult -= Num; 0 C6 t7 a6 }' ?3 A break;: c$ Q" f/ U/ F% n3 q& j( | case 3:' L& m# N$ p; z; f, F& c* k preresult *= Num; * G; d6 k# r* E, }' t- i break;4 h. s' E. K- i6 i! t8 [' Y' ] case 4: 0 ?% D0 y2 }4 l: x! U2 o* Q2 L7 _$ L if(Num == 0) return -1000; " Y6 [4 N5 @1 T" G7 p C2 t preresult /= Num; : A( s G2 x, I I9 f break; ) f3 z/ z' a4 ? } 7 z1 M( a _ Y- p" s0 f" U i++;j++;. O6 c3 N; w( r, f: P! n } 3 l: }6 ^( z, Q0 p ~ return preresult; //进行修正2 }, l- v& a' G+ G% }& f } . @8 n5 u# N% v// 打印算式 1 l6 W4 {* W S$ Z3 Z- ~/ ]void ShowFormula(int *Num,int *Sym,int count,int sum)5 d- _5 g) ^) F4 v0 g: t0 } {/ k; o9 w$ X8 S; ` / C; V. u. s: r4 M* Z$ R int i,j,len;. N/ ?, w5 G4 ~3 ~& z4 i( i char *Formula = (char*)calloc(count*4,sizeof(char)); + o4 Y1 }- W; v, ~: m char temp[10]; 6 `$ S8 S/ Q1 b9 a( d7 s$ m itoa(Num[0],Formula,10); F' |' B1 j- X; z+ A. ` i=1;j=0;9 U$ s+ f: i1 e while(i y. e8 F; i' Z' A {6 y* E- f0 }5 F8 E' Z3 g/ o itoa(Num,temp,10); - @- J( |) Q8 [3 b' ^ len = strlen(Formula);4 N7 y/ {2 M+ b. {. g switch(Sym[j])# n7 ]6 P; `0 L0 J2 j! r- x8 u { ' u8 s7 ~, K; w7 Z6 y6 Z( g0 y case 1: 6 S5 {7 N% G7 y case 2:- B) L" H7 _6 ?; x+ P* ~& W( V% k Formula[len] = cSym[Sym[j]]; ) B: a) ^. d) e- Z0 K strcat(Formula,temp);5 _9 Y2 ]; S- w0 L, W break;1 _9 e' I; }$ Y. } i case 3: # r5 e, m, l* {+ S* ~ case 4: 3 [ K& Z* y5 L% X" M/ n3 x; m ) g, E2 Y2 X7 u d: G* |9 e // 如果上一个操作符号优先级低于当前的,应加上括号 . m# P/ _5 ^) T F& P. f if(j==0 || Sym[j-1] > 2) - ]4 J* i$ r4 O, G {6 e3 J( u/ k d; h* R: h Formula[len] = cSym[Sym[j]]; % O; P5 w7 }) }. }% A strcat(Formula,temp); 0 U, p$ R$ b2 K. h6 i }1 f' m; ~) d7 b- V/ K( D% V$ g else7 b+ [) P! K7 _1 D5 ?7 { { ! O2 b% e: i) l# T0 Z int n; 9 p* a# F4 I# I" {' u% Y" Y char *FormulaTemp = (char*)calloc(len+1,sizeof(char));5 U, _- R4 x; ^: F for(n=0;n* \0 F/ O& o ~+ u { 3 p. M$ k2 z$ k+ ?& u8 Z9 ~ FormulaTemp[n] = Formula[n]; n8 T, |" |# I( S Formula[n] = 0;& c4 c, {, c c) f0 |' M } ) L5 t- {. I; ~6 k# Y Formula[0] = '('; ' O; \$ ^: q; u( Q strcat(Formula,FormulaTemp); 5 n4 M9 {* v. i- t! x7 M1 m3 o% h free(FormulaTemp);( Y, t6 ? U* W& A$ |; U4 _ Formula[len+1] =')'; * y, n9 o8 X9 i Formula[len+2] = cSym[Sym[j]];: ~6 Q3 U+ h$ [/ \# K' x1 O6 U0 f& \ strcat(Formula,temp); - O: D2 y1 j# ]% ~9 X$ p. _$ N }6 k9 J! N% @0 @+ J; ^ break;; f9 i; g* g- T" ~& u, t" k }, Q, Y* @, T9 V7 g P9 ]+ i i++;j++;" X! o! Y! f6 p s2 v }" |4 J) V5 O8 D printf("%s",Formula); - }, f! i* R) ?# c printf("=%d\n",sum); ; D! ^9 }9 e2 r# i3 B free(Formula); : y/ H5 v5 {9 u2 J" v' F}/ `: ~* r4 ?: H' N) l- o; f* O : k4 [# H7 h$ F2 n* p; ?" r// 以当前数组为基础得到一个从小到大排列的数组6 _ }8 q6 K$ D/ C, T6 p* A- h$ Z // 返回非0表示穷举结束; \9 }; k1 j6 I9 R! J# ? int EnumArray(int *Num,int min,int max,int count) 2 K/ P; o" I5 \( ?/ \{ 3 ?# z, a6 v2 D int i,top;9 z' E( X2 V4 U2 h top = count-1;( ~( x/ Z; F4 A) K {2 Q' g Num[top]++; " U( y" O7 v' I4 p while(Num[top]>max-count+top+1 && top>=0). t6 F+ p: y, d! H- D* F7 r# _ { 0 z c% j6 n& U. m$ x& Z3 q top--;6 ~8 v- h2 W0 n% J" b, f5 o Num[top]++;& J3 ?$ ?% T1 x6 ? } ' K' S( Y$ g! | for(i=top+1;i& X5 Z# ?! |7 L' ?# m- f { ( W! a4 a* W3 |' e Num = Num[i-1]+1;1 |( R+ N! d1 ~9 U1 P! f }! g9 a( l' o- { if(Num[count-1] > max) return 1; $ l X- L% z6 A& D# f9 o* f4 M else return 0;, k0 `. o9 U; X) A" E }' v6 f6 J* g/ Z. I9 W; e! F 2 f J$ \, }' r+ x2 J. H// 不允许重复的初始化数组 ! S6 S& m! r: J; W {9 W2 |void InitArray(int *Num,int min,int max,int count)+ s. G7 D/ d1 ^/ i6 Z4 t+ i { 0 `; a7 a+ x1 A int i; ' @0 c! M0 I- H8 n1 z6 [ for(i=0;i=min+i; / N, q- `7 H- i' P9 y6 F, [7 S Num[count-1]--;9 j- k6 {% x6 f% U- g7 z& m0 q4 ~ }; E# H$ l/ J# p$ U7 ^; U1 X ! w1 O1 F: Y! p. p/ Y* I 6 c) s, k" v" ~# K/ w. R' ]% [$ K7 e. {+ ]9 r% o, L N# ? 6 g4 G$ F$ w, ^5 _! i/ \ U& @- [
    [此贴子已经被作者于2004-5-2 14:50:47编辑过]
    $ u; U8 {2 f( a: | [1 {; H1 O

    该用户从未签到

    11
    发表于 2004-5-2 14:54:00 | 只看该作者
    本法穷举出所有用min - max之间的num个数组成算式,结果为sum的情况# u3 d9 L+ Z; ?6 V# P

      g; l: S$ t7 L( v: a+ z- j1 S5 t* s如要具体的话,可以不穷举操作数,直接输入操作数,进行操作符号穷举
  • TA的每日心情
    奋斗
    2015-9-17 00:58
  • 签到天数: 1 天

    [LV.1]初来乍到

    12
    发表于 2004-5-2 15:17:00 | 只看该作者
    以下是引用游侠无极限在2004-5-2 14:41:26的发言: 3 N; }! z* r' R. k, K4 I6 _. o#include 3 z3 U8 Q0 ^9 O7 K9 B #include ( i' \7 z/ m( y# G: `/ [ N' c. M% b/ X6 ^6 m! S int EnumFormula(int min,int max,int num,int sum); / _7 v# @3 G, ? void ShowFormula(int *Num,int *Sym,int count,int sum); # i' S4 v; ^8 c- |0 J2 k1 @ double GetFormulaVal(int *Num,int *Sym,int count);+ K8 r- o' J! l# |- [: C$ T int EnumArray(int *Num,int min,int max,int count);) \6 D8 d, x7 \ void InitArray(int *Num,int min,int max,int count); 3 {2 i) I# {! @, P! Q! X0 |' T const char cSym[5] = {0,'+','-','*','/'}; & J3 t C& @, v' l( O6 Y& S 6 X" k4 P) m) ~: a int main(int argc, char *argv[]) % c. B0 K' h9 h1 k0 | { 7 O& K9 b% {) S) C' u printf("总计%d个式子\n",EnumFormula(1,10,4,24));: k' `9 [, ?/ \ system("AUSE"); / `' B' N, S) F2 d# ^' d return 0;2 m/ M( p0 m/ W }0 P( G) ?2 J0 |# P% J2 m& V! Y5 N% M0 n : O1 e) Y( e5 q- z+ z" U4 m' Q int EnumFormula(int min,int max,int num,int sum)+ D9 q$ L R$ g: k/ r2 d. h) h }; l { ' X3 j% C! Y }$ ?+ c int *FormulaNum = (int*)calloc(num,sizeof(int)); //储存操作数- I+ y* e' @; @: ^ i. N# k+ { //储存操作符号 5 b4 R K3 t8 q; w //最后一位用于穷举结束标记 5 l) O3 m5 ~9 C6 ]4 U // 1 - 4 代表 '+' '-' '*' '/'* L6 |! w3 |$ K0 U+ Q int *FormulaSym = (int*)calloc(num,sizeof(int)); 9 z+ |: @8 B5 r" J. j% j. q * F2 |& V! V9 ]3 Y Z: ? int result = 0; ' h( D/ u. [2 J w) d // 初始化操作数和操作符号数组6 M. j0 {& m, O O / |! Z) d5 p9 K6 H8 N int i;+ N: W0 j6 Y8 P1 P n" A' U - B1 F+ h. W5 T2 ]! h% Z for(i=0;i = min; 8 b. v( r M1 j& r& a3 @ for(i=0;i = 1;7 d& L5 x8 _9 l1 i- p" d FormulaNum[0]--; - o9 S8 X& |$ |! T @2 M+ t6 x# F/ D4 D E- c$ M# b InitArray(FormulaNum,min,max,num); 6 A, H& N3 O6 I3 [0 v, g$ g FormulaNum[num-1]++;) M; y0 ?& s9 ?# N% L0 y // 穷举操作数和操作符号组合5 c# @$ u H9 g( X while(FormulaSym[num-1] == 1)- y9 |" S0 W# I3 \; P8 S0 \ { 1 x0 f" G7 P ?8 ^ double t = GetFormulaVal(FormulaNum,FormulaSym,num) - sum; # l K9 t4 L& z- c6 \$ b, X+ q if(t>-0.01 && t<0.01) 4 P7 ^; d3 ^+ t8 U' r {. ~, @( m% `1 G$ M- c, u; P! e //printf("%d %d %d %d | %d %d %d ",FormulaNum[0],FormulaNum[1],7 c3 ~; A: Z0 R9 l+ r9 M% n //FormulaNum[2],FormulaNum[3], ! C0 @% {5 B5 a2 e5 W* f) P // FormulaSym[0],FormulaSym[1],+ |4 g4 c$ h- y& d* f2 l // FormulaSym[2],FormulaSym[3]);; X- L: T% @0 ]/ t5 Z ShowFormula(FormulaNum,FormulaSym,num,sum); ; v- r1 w+ t2 E2 d' L result++;' l7 ~8 [* r3 |* V' r. p3 a8 o }! W6 Z/ t) I% y! C x( L5 z 7 w% p& q. @# Q# @: V // 依次穷举操作数5 _7 g. V5 m% {# x, l1 I h- w " B: S% \" I3 k5 c9 o* ^ //允许数字重复的穷举; `& Y, i( K' k1 s, X1 q //FormulaNum[0]++;7 z" G* |) ~: P" S; r% ], C% { //for(i=0;FormulaNum > max && i) z( z; K" }5 W9 m //{ % t; L# {+ k' p7 g) c // FormulaNum = min; * Y \( M. O# y: G8 k // FormulaNum[i+1]++; $ @- a) i+ I! ]# L f //} 6 u" z5 ], m6 v6 N7 p // 操作数穷举与操作符号穷举联接- ^6 C2 L( P8 w D% h8 g$ p- ` //if(FormulaNum[num-1] > max) ' R/ Q7 A I% c) L" U- k //{/ q; K! D8 _; s: v# o% O- M0 b; ` // FormulaNum[num-1] = min;8 ~" r# O% C( |* j // FormulaSym[0]++;% g( Y3 s; g6 G1 |$ q7 R+ j) m //} " c0 i. O! _* T6 B% n( R/ b+ e 8 g i1 j7 n" s A2 y' R // 不允许数字重复的穷举 8 [1 i3 I7 W! b/ I1 l // 数字必须从小到大的排列,防止重复 : E& H' R/ k7 i2 i# s! x7 m2 H" p if((max - min)< num) exit(0); // 出错 % y8 \% }8 f5 s$ e 9 ?- g! y& w4 g$ I" a if(EnumArray(FormulaNum,min,max,num)) : x4 m- R4 D! D5 j {* G! s1 [* g2 n2 J e8 t# \ FormulaSym[0]++; {- B6 W3 j0 @# ~0 A4 q9 S( N. l. S3 C InitArray(FormulaNum,min,max,num);! y9 p$ S& H }6 ?% {3 q; X9 m( W: ~ FormulaNum[num-1]++;. n0 B9 w5 I) S' \) A' _6 A, m& T$ I1 Q }; }4 M& s7 _6 m0 n: l* o8 [1 h1 X , ], ^" J( d# n$ H // 操作符号穷举 $ ^- v. w$ V, K4 k7 b2 g( b7 j for(i=0;FormulaSym > 4 && i0 b$ e! p5 j k. i+ | {( @& d7 s) K# g" ~/ t FormulaSym = 1; 9 A: F' |6 b& t! _: c$ _! O FormulaSym[i+1]++; ) C( t- m+ `6 r$ ] } : v' X* m- K1 s1 I. G ] Z }* v' y6 T, h& c- Y }8 q/ G) R) J9 h1 X //释放空间 ' g1 ]& O' y! B7 R- O free(FormulaNum);4 h _: |6 ^& S7 i" u" z free(FormulaSym);; \1 o: h3 I# g return result;8 M) k0 N) e) k7 O W; b }6 N5 |6 u- c7 p6 U8 k0 Q( w // 计算算式结果 + k, s% C1 Z5 |: V8 D7 Z double GetFormulaVal(int *Num,int *Sym,int count) ) x( ^/ D0 l/ ~4 }6 g! Z+ }+ o {; T8 k3 j7 Q. G% S1 q int i,j;' V1 D2 [+ t. d# o6 c0 } double preresult;7 G, u& T! p$ M- j! d preresult = Num[0]; 0 O5 _8 k' _7 }: d9 @" a; r i=1;j=0;9 b6 k& d1 ]" P8 O; x while(i6 k+ E: ]9 I: }5 U( t; W* N {) b4 i3 l7 W, n# w* ?5 b switch(Sym[j]) , p% B6 s+ g: _4 L9 W {/ a0 E' d. _$ l/ K* H4 Y case 1: & U4 g( ]& n0 q% ]5 Y9 \ preresult += Num; # k0 g! D# N; r8 L break;: s$ J# J1 G* i8 k case 2: & O2 I$ j, ~4 A5 f" U7 _+ l, D7 j preresult -= Num; ) p! I/ R$ i& \9 F' b T4 ? break;" }. h, }1 l( Y( p6 ] case 3: : J( F9 K; a X preresult *= Num;: w; n- D( g5 a) k/ [" y break; j5 l& h7 V4 s: q" l1 \ case 4: - i+ _" ` M. T if(Num == 0) return -1000; 2 T- h4 S( B, `: ?1 o preresult /= Num;6 j! W. j6 H; h3 K# I8 `2 e( f break;6 w6 Q3 D( S/ j4 ~9 \* t6 x } / ~+ P. d. u) `* D. S i++;j++; " i" R* Z1 A7 |) m I } ; |8 z# U; t- c! s6 \) ` return preresult; //进行修正 3 W! F0 H3 p7 z) N* X }7 h# @5 q/ _" L$ ?! D: f+ v // 打印算式) x' n# q9 U- ~, T' F4 A void ShowFormula(int *Num,int *Sym,int count,int sum)' A2 Z" s) S: r# I( o {3 q, i1 Q- ]7 Y r# f% i 2 Y0 l* ]3 R7 M7 [2 w1 R( F int i,j,len; 6 f6 C- C, R* V/ K- Q) i6 `& o& C: u char *Formula = (char*)calloc(count*4,sizeof(char));' F1 g: D5 X7 m. D! t char temp[10];/ l4 c: g+ y, Z+ R itoa(Num[0],Formula,10); 7 T, y% C' e+ |" i, I0 ^: V i=1;j=0;9 ]' m9 t( O% D+ Q* [ while(i* R8 D- u- {8 n# O {% u4 {4 v5 C" Z2 s* ~* ?3 } f itoa(Num,temp,10);1 d, }4 f7 _% J% W1 y len = strlen(Formula); ; G; e3 T5 T) d switch(Sym[j]) 0 q+ N6 \ a# e# r- Z% h3 q6 L- Z {1 I. r, m" }. k8 G+ w3 M E. S0 c" e5 U case 1:4 z4 Q K/ U3 S4 u. `) W case 2: ! A* {7 F6 U3 f Formula[len] = cSym[Sym[j]];: h: d. l" Y4 R: x& Z% u strcat(Formula,temp); % W+ l% a7 K" H/ D; I7 B6 a4 c break;5 G& D# p9 W, l# c6 T* ~- S7 {# o* C/ q case 3: 0 u' O4 a" w% i% T4 c7 s1 p case 4: 1 F4 b' E. z6 f % {+ N8 g/ H0 h7 g2 w // 如果上一个操作符号优先级低于当前的,应加上括号 : u5 r9 H2 T7 O K if(j==0 || Sym[j-1] > 2) 5 N: N! X. r/ H ^- P/ }" [ {: |( N9 r# {6 `9 A$ s0 k% W5 S9 u Formula[len] = cSym[Sym[j]]; 9 ]4 v C) v$ s- Q, O strcat(Formula,temp); + |% E$ [: E: P" P c } & k1 L" F- C& K5 s. N- k# r else) t3 x, y# B1 G" A3 ~; C9 u { 1 m; `% r8 Y% ^% }2 {# u4 | int n;" e9 z6 P0 \9 Y7 R6 Q char *FormulaTemp = (char*)calloc(len+1,sizeof(char)); % l7 v9 ~- W! G5 D! I2 u for(n=0;n4 s4 u, a/ O7 z0 B- G4 M {6 v2 X' u j: R5 \% u7 o FormulaTemp[n] = Formula[n]; 8 Q* W- }- M# l Formula[n] = 0; ! t. } `+ ?7 t } ' R/ T8 [% S+ k Formula[0] = '(';8 t1 R) e; D2 @) g1 c* b strcat(Formula,FormulaTemp); $ _7 z5 c; V: ~+ R5 b free(FormulaTemp); ' X- y4 ?6 u: ]4 X Formula[len+1] =')';( ~- M$ q9 o: q8 `, h Formula[len+2] = cSym[Sym[j]];2 b+ U. b8 G3 l4 `; Y b4 z strcat(Formula,temp); / S( [% W! x- ~% {. J' ~ } ; r6 l: f$ ]5 X Q5 z break; * ~; c2 a+ O1 P2 q( C }, Q9 N3 ?. `' J/ x0 ?/ { i++;j++;& v6 O) W# c' q: J' m } ; _/ d" c" Z" V" ] printf("%s",Formula); 4 W7 W5 p* X4 w) ]" p printf("=%d\n",sum);1 R( N8 L; y7 \% { free(Formula);1 n' [2 y' w4 i; N5 U3 A1 T } # E' U5 b' E* o& r7 W( Q: q2 [! n# I3 V5 ?" i$ b( ]; ~4 t // 以当前数组为基础得到一个从小到大排列的数组 / d( I, q; k8 [1 D, Q# j // 返回非0表示穷举结束/ d; J7 p$ r: _ M0 { int EnumArray(int *Num,int min,int max,int count)! h7 c$ }) [" P { 8 Z) h4 C( Q! P3 Z int i,top;6 p @ K* `6 h top = count-1;4 `8 }% }- A3 d9 V Num[top]++; 0 Q" R; t; x( r while(Num[top]>max-count+top+1 && top>=0) & T" _' R3 w$ U& `; b) E: V { % h0 L9 Y# R) J9 T1 f4 a9 D top--;1 }3 `: |, L( M4 E% ` Num[top]++; ) L, C. n1 ]0 I" r5 O3 v) p }- ^& ?! B8 R% \% O0 g3 r: | for(i=top+1;i/ s5 c" x9 f1 B0 }4 M1 U( n+ [+ c6 | {3 B+ i) {5 Z) ~! z Num = Num[i-1]+1;, m5 `# h1 i) C1 ^ } ( k+ {4 ] A* {. Y$ r7 D& ] if(Num[count-1] > max) return 1;0 u/ D4 n) y$ p6 \+ s" X+ y2 T else return 0;- h; D5 m0 X9 Q, ?; f } & w4 w7 ?) A+ b0 a9 P( l# e/ _8 y+ O# R1 V. M4 n' b" n* E# n) J- ^ // 不允许重复的初始化数组 + ] h! y# e; { `5 } void InitArray(int *Num,int min,int max,int count)2 s# m( ~8 ?5 S& K( f" ? { ' {' z6 s2 f: c) x" J8 s4 V% { int i; 2 F7 J; ~: X2 r( ]2 Z for(i=0;i=min+i;! N7 f0 `, Y2 w% t$ I5 t4 H' L1 X3 \ Num[count-1]--; : E- W- v6 q+ m" ]: Z" @0 J/ Q }/ u3 w- y) `) S. w: {' w. Z * f. v9 C1 @! p7 e # f% P+ H/ V8 J* F. w & I, n9 v. b! h$ F8 P2 G' k- z + [- I4 W) I( z/ H1 h
    [此贴子已经被作者于2004-5-2 14:50:47编辑过]
    ' J$ G: ^1 s1 [. \& \2 w. B/ o9 h8 l! X9 T! P& k) b printf("总计%d个式子\n",EnumFormula(1,10,4,24)); 的运行结果是:! I! i& K8 h' I, x6 Z' ]3 L 1+4+9+10=24) |" v3 k# j. R% i+ E 1+5+8+10=24' l1 B7 U+ T$ {9 q2 z& U 1+6+7+10=24 & N2 ?9 e% P& j' n- |( e' Y1+6+8+9=247 m* u* ?3 r0 s2 }, R 2+3+9+10=24/ u ?& t- g, ^" x& ` 2+4+8+10=248 ?+ k* |5 N/ b R& W1 z 2+5+7+10=24" c: G3 }, g! q 2+5+8+9=24" @, Q5 { f( T( e8 v9 R 2+6+7+9=24' O. L( P+ K& X9 I& X7 w+ { 3+4+7+10=24 1 Y7 J( \% ?0 A: M! t' u( m b' z3+4+8+9=246 X: ~4 B$ I! _2 f 3+5+6+10=24+ O0 A: L D8 Z$ Y: N6 c& _4 e 3+5+7+9=24 ( e& x# l, c2 F! k- k8 J3+6+7+8=245 u( f. Q( r3 |& Z9 d 4+5+6+9=24 2 K4 u/ g1 H& D& v: ^& z: l4+5+7+8=24 7 r6 |) V! x* Q这是什么意思?似乎是找出了 1 至 10 之间的和是24 的数据,这和完成计算24点,差很多吧? $ o% W* `4 g( m( i( c4 _比如用户输入 2 ,5,7,8 程序应该能得到计算这四个数据得到24的表达式才行啊,这样就可以写一个游戏了。 5 Y3 ^: @) Y. S! I6 R: I# R如: 1,5,7,8 有如下方法可以算出 24' M- q" P7 _1 ?, a( h" ` ((1+7)-5)*8 = 24 0 |+ f' O4 q ~ C& P((7+1)-5)*8 = 24 8 a$ H9 H$ X% t" o- Y: K(1+7)*(8-5) = 24- q7 B% J: B* B& P (7+1)*(8-5) = 24 " H7 {8 u1 \: Z: P4 J((1-5)+7)*8 = 24% R- j& v% e+ w+ F. | ((7-5)+1)*8 = 24 f5 g, @. @/ x, ]8 w (8-5)*(1+7) = 24 ; d1 d0 ~% f- t& F6 {(8-5)*(7+1) = 24 5 D K6 Q; L" W, R8*(1+7-5) = 24 - M$ A& T9 ?# m2 m* k8*((1+7)-5) = 241 Y7 L+ t3 G2 W% l. ?7 k% [ 8*(1+(7-5)) = 24 / u8 ^5 i! r7 q$ ~: q) u8*(7+1-5) = 24+ n i% B' k# \9 f, f- K. X( `0 o 8*((7+1)-5) = 24$ @- d* x) I% h3 ` 8*(7+(1-5)) = 24- Q% X( p7 F: E- [2 T 8*(1-5+7) = 249 y1 J" X- a: ^4 T7 G, c/ I$ b 8*((1-5)+7) = 24 ; r* [7 i& O* t2 b) H4 J( `7 l8*(7-5+1) = 24 # R3 a7 l" a3 N% J/ K8*((7-5)+1) = 24 2 g" r( v t: V: }% N/ s

    该用户从未签到

    13
    发表于 2004-5-2 15:21:00 | 只看该作者
    结果是这样的:
    . ^$ t( d7 B/ l1+4+9+10=249 s' x4 f$ d! R( l3 I. L, e# s
    1+5+8+10=24
    , z# Y8 J" L$ f- d; r1+6+7+10=24: p4 Z$ c6 T: t+ v! v* ~, Z4 ^
    1+6+8+9=24
    ) v9 Q. H( u2 y9 F$ q' }2+3+9+10=248 x3 u( a/ m0 A* f& y! q1 Y) v8 I1 y, \
    2+4+8+10=24/ B. ^1 z3 [+ ~" S
    2+5+7+10=24
    2 n. S+ D% }/ P6 ?& m9 |2+5+8+9=24' r; M( P, r, z
    2+6+7+9=249 H- i7 ^: Y% Y8 Y) I
    3+4+7+10=246 ]4 j1 ^: Z2 ^
    3+4+8+9=24
    : t" e# x2 n4 Y3 o3+5+6+10=24
    , G% U% ]! r8 c: M! T  @3+5+7+9=24. ^7 r: F6 u, f& T
    3+6+7+8=24
    1 g# D! q: ^  O  h4+5+6+9=24- U% d& Z( ?* j6 w3 d! z
    4+5+7+8=24
    $ u- @2 S* }: w- c5 e8 o1*5+9+10=24
    2 G/ P& @. B; `1*6+8+10=24
    5 v& b6 T: S. n; v# S) f% r1*7+8+9=24- k6 h4 `1 w/ J: i* K3 A$ Z
    2*3+8+10=247 c0 x. G7 F. F1 c' {* C& f5 v
    2*4+6+10=24
    2 x9 z8 B5 \* F6 ?, @) G7 ?2*4+7+9=24
    2 W* A3 \% E# T* i  t2*5+6+8=24- m+ I' ^* S, I  ~
    3*4+5+7=24
    3 s: n" z2 n8 k3 w; u& K- ~+ \8 @4*5-6+10=243 h1 A1 f* M# t3 ~
    (1+2)*5+9=246 a6 j* T. a% q9 r
    (1+3)*4+8=24
    8 v; y9 }9 n) E& ]1*2*7+10=24# e$ ^( M1 y: s& M2 h* ]5 S
    1*3*5+9=24
    , t8 J( ?$ d( ^7 Q: ?4 F% L6*7-8-10=24
    4 X, c4 c) g7 j, w(2+4)*5-6=24  t5 R% g: t5 h0 R0 I3 j) }
    2*3*5-6=24/ L% E/ y9 a% N0 c4 b2 ~  P
    (1+2+3)*4=24. T$ ], w+ ~( ^
    (1-2+4)*8=24
    0 a7 h+ Z: F- {! g3 j9 U(1-2+5)*6=24
    ' o3 l2 o+ y2 y(1-3+5)*8=24* [7 V6 l$ u, `; ~% z$ Q+ `
    (1-4+6)*8=24) u7 m. H8 @  g/ L+ ^6 K
    (1-5+7)*8=247 _, E0 x0 H' h
    (2-3+4)*8=24$ |* ?3 p% Z$ k/ j& J% @' K
    (2-3+5)*6=24
    5 l3 |6 o) Y8 P" e1 I  j(2-4+5)*8=24
    9 k( ~: u8 o$ X' c: c% w7 d/ R- T(2-5+6)*8=24
    0 O; y: A$ H4 W' W; t(2-6+7)*8=24
    $ }3 Z5 F: ~& R+ F(3-4+5)*6=24
    ( e6 R  X. d0 Y% V2 \" `$ e- O(4+5-6)*8=24& x4 K$ X  c* S  F2 D3 C  D
    (4+6-7)*8=24& u$ J4 ~  {( q' ?. V7 \; ^0 D
    (2*4-5)*8=24  l0 W( P' ]8 t7 Z2 ^/ }: j% |, U
    (2*5-7)*8=24
    4 l1 p  w$ @2 ]0 B* u: R1*2*3*4=24- R" d, }: {; {. C( Q; ]
    1/2*6*8=24
    ' ~: B5 w+ u! X6 P, `5 U1/3*8*9=24
    & }$ W2 Y( X1 ^0 i2/3*4*9=24; ~. @" h( Z1 O; v( O
    2/4*6*8=24
    % w5 F6 e" V& s7 Y2/5*6*10=24+ y) P# W% p& C  F" M% q: q
    2/6*8*9=246 Z4 Y; k- w  h! r+ A
    3*4/5*10=24. K- Y. f  j- y: u
    5*6*8/10=24* Z$ f2 I8 `$ [$ @
    总计57个式子

    该用户从未签到

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

    [LV.1]初来乍到

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

    [LV.1]初来乍到

    16
    发表于 2004-5-2 15:28:00 | 只看该作者
    (2-1)*3*8 这个算式你就没有啊,这4个数字的组合都没有出现
    * v. r1 ]. z+ H3 w
    0 g: o1 c! e- q2 j4 l1 r; f) D6 y; T7 E, u; q+ n6 v

    5 J4 k6 t4 _4 w1 W' E( G7 G  g3 |  [, V. j" v; @# C7 p. z
    ' k- R5 e  n0 u* ~

    / R2 v. l3 M# G/ q2 J
    [此贴子已经被作者于2004-5-2 15:32:12编辑过]

    . o$ L- O. b/ W7 g  n
  • 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 | 只看该作者
    & o8 e5 o0 v7 \. [" ^

    " n1 T: S4 i7 u8 y用这个好了,只不过输入的时候要按从小到大
    1 d) p% V4 B( e" W6 P( k
    ( V! p" m1 y+ Z( O- ^好象有BUG,我暂时不太清楚

    该用户从未签到

    20
    发表于 2004-5-2 15:38:00 | 只看该作者
    以下是引用yzhlinux在2004-5-2 15:28:15的发言:
    3 `5 c2 y. B) p, q# ]7 [$ e(2-1)*3*8 这个算式你就没有啊,这4个数字的组合都没有出现

    # g9 X( `0 Z$ U' e, {, @' G
    " V$ A$ S; S: P" ~  G本来为了防止诸如( A: i, j1 ^, c
    1*2*3*4
    2 y9 k( }$ Z, O  ^( g# A1 ]! e1*3*4*22 G, r3 ^# I: A3 H9 k
    2*3*4*11 O5 k' D- I' f4 }. k3 P+ A$ L, q
    等的重复,只使用了从小到大的数组,不过这样好象也丢了不少可行的式子
    3 `1 ]8 Y3 ~9 r4 G+ D3 O* z2 A- C0 R
    另外你的程序就是有这些重复的
    , H7 \8 b4 a& K# d! _; c
    1 ]) b- J& S" D4 H, `& Z6 KPS:VB的程序感觉就是慢好多啊
    * _: y3 P; A& R1 _, ^9 y8 |
    [此贴子已经被作者于2004-5-2 15:42:01编辑过]
      x- s! G5 n8 x0 e! `

    本版积分规则

    关闭

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

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