下沙论坛

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

QQ登录

QQ登录

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

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

[复制链接]

该用户从未签到

跳转到指定楼层
1
发表于 2004-4-27 17:53:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
就是扑克里的24点游戏,4个数,+-*/得24……8 c9 j: t" j5 Y, O- Z6 }  K

5 Z/ f) S7 |2 c- f0 s) F偶还在想……
分享到:  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的发言:
    7 v/ u2 H5 }% m% u+ H" I穷举法吧

    2 G! Z0 s+ R( l' }$ n那你的代码要写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 F1 d3 H: T# g
    function GetMach(A,B,C,D) as String       '得到一个字符串组合如:(A+B*D)-C
    ( b/ Q/ A. f. V* Bfunction GetValue(MachString) as Float    '得到字符串的计算值 ,可能是小数( w2 H% S5 W* _0 p/ q
    那么程序就好写了:
    8 E+ s% d. r2 _1 @GetNumber(&A,&B,&C,&D) ;    '得到ABCD则四个数字,赋给A,B,C,D四个变量
    7 n' H$ h7 c4 r2 X) zdo{) L( A' N' h2 w6 V
      MachString = GetMach(A,B,C,D); '得到一个表达试的字符传* V& Y+ ^, s' K+ Z. `# i+ j
      if(GetValue(MachString)==24) break;
    ! o! {/ w5 s& j6 ^" V2 ?, T$ V" B}1 C9 N. w1 y, K
    print XXXXXX;
    % O; k) J) S8 d

    该用户从未签到

    7
    发表于 2004-5-2 11:57:00 | 只看该作者
    我现在试着在写,就是不知道有什么好办法解决重复的算式问题,比如" h( Q/ \  n( ?2 d" @3 i: v
    (5-2)*8*1
    ; J; q) `/ {# _* ~% _4 c# g; G1 R! |7 v/ _% ?* B
    (5-2)*1*8
    ( {" Y( K& q! o& |8 q0 j8*(5-2)*1/ H  k3 m$ @& G
    等等
  • TA的每日心情
    奋斗
    2015-9-17 00:58
  • 签到天数: 1 天

    [LV.1]初来乍到

    8
    发表于 2004-5-2 13:17:00 | 只看该作者
    4 v0 f% I* W6 T% W

      l7 s- P9 p4 X- r' e; x% b: H花了一个上午,终于完成了
    , _2 q/ ~5 k; C: m- @/ y: L你参考参考吧,哈哈
    6 u3 w$ v- |* f0 E
    ) X) w4 s: ]+ c- _/ U0 ?2 c
    4 x( I7 W6 P$ c8 H0 K8 s0 z* T
    [此贴子已经被作者于2004-5-2 13:43:13编辑过]

    % ^  X; n" F& p. m  q
  • TA的每日心情
    奋斗
    2015-9-17 00:58
  • 签到天数: 1 天

    [LV.1]初来乍到

    9
    发表于 2004-5-2 13:42:00 | 只看该作者
    上面的发现有一点bug,
    ) v$ q+ D6 g8 f1 _8 r5 |( f( ^" |这个改过了6 B3 D! c2 U" F$ A6 t! M& F
    一个计算 24 点的小游戏
    7 D) l5 I4 f7 @9 }. K- eVB 编写8 G- y/ B- ^$ V5 d. a9 A
    ( F2 d6 x* r  p) ^/ ~4 N0 W

    % t% B9 F  h& f' p
    [此贴子已经被作者于2004-5-2 15:17:46编辑过]
    3 o% m2 j0 J* a9 m, Q( O1 t3 r

    该用户从未签到

    10
    发表于 2004-5-2 14:41:00 | 只看该作者
    #include 5 y4 X: }" `6 Q+ m9 D! E. i#include 6 [8 v: Z+ c, P2 _9 J " E8 B" w; V I4 v7 x1 U+ bint EnumFormula(int min,int max,int num,int sum);8 V4 u8 L7 ?0 t7 _/ ] void ShowFormula(int *Num,int *Sym,int count,int sum); / @. ]+ t* v6 x) z1 V! t+ S, Hdouble GetFormulaVal(int *Num,int *Sym,int count); ! @7 V3 I( ` B% W1 y% E0 x% b* P: gint EnumArray(int *Num,int min,int max,int count); 1 F! J( C. f9 ?2 D2 l9 [void InitArray(int *Num,int min,int max,int count);, i4 b% _/ A# e2 \, z) ~. P7 I, Z Y const char cSym[5] = {0,'+','-','*','/'};6 f# M: y/ J! d& z 8 R- s3 ?$ j1 j/ o9 S' } int main(int argc, char *argv[]) 7 T0 _" T+ @: `4 i5 h& b{; K+ Q0 d$ O2 j+ M2 A) Q m% G% H printf("总计%d个式子\n",EnumFormula(1,10,4,24)); . `& G% O5 ~8 l: B: J6 ~ system("PAUSE"); * M# [$ X; e" C return 0; % ]# a" f' [3 [" _, Y} ! a) V# I/ A% @$ S2 { - d1 t/ G; ~+ Y. K4 |5 w1 }4 x! Q( ^int EnumFormula(int min,int max,int num,int sum) ! G* o1 X5 ~6 ~) R& p* N- J! K{6 S6 ]5 X1 L: h" v9 `' H int *FormulaNum = (int*)calloc(num,sizeof(int)); //储存操作数 4 K. ]- ]& S) t6 a //储存操作符号. w* n1 t+ T3 H9 t2 }4 C- i# n+ G //最后一位用于穷举结束标记) m! r& Z) {% V. P5 W // 1 - 4 代表 '+' '-' '*' '/' $ b5 K+ Z! N x& m7 Y4 R0 F int *FormulaSym = (int*)calloc(num,sizeof(int));8 h4 f8 S5 w5 r2 V( d. g7 B6 }, N " F: S6 y3 E3 Y+ A int result = 0;, F1 R0 D% }# |7 c // 初始化操作数和操作符号数组 $ m' Y' u" G% ? " w3 \5 D3 {+ k int i; 3 {3 v9 h# d# a" W3 E4 V2 I 5 @8 V6 @6 Y/ i) w1 g for(i=0;i = min; " W( U4 Z6 ]! [' @* `( d for(i=0;i = 1; ; s6 F% p/ i& y8 A# t, {/ ]) o FormulaNum[0]--; + A& u: D- E7 D/ D3 f A 6 v; R9 o2 H# l. P' A! Q InitArray(FormulaNum,min,max,num); 0 m+ ]4 h8 ^- v2 n FormulaNum[num-1]++; 5 K, t3 Q0 N6 G! }+ I9 @ // 穷举操作数和操作符号组合8 W: J- t4 B8 V2 E9 R$ O& ?6 I while(FormulaSym[num-1] == 1)1 i: v$ i+ E' L6 ] {) n6 p! W' U2 B, y5 i3 w) j2 x) E double t = GetFormulaVal(FormulaNum,FormulaSym,num) - sum;" q. y4 R9 f, \7 q) B ?( z if(t>-0.01 && t<0.01) ) x, \4 _) k, z, [! s { ! p2 B- x- a( n. { //printf("%d %d %d %d | %d %d %d ",FormulaNum[0],FormulaNum[1],& Y+ B/ K: Z1 m' |$ \) I3 ? //FormulaNum[2],FormulaNum[3],. ~% d: R# A1 _% J2 X6 |- K // FormulaSym[0],FormulaSym[1], 2 l& @0 J1 e' B0 e9 l8 S // FormulaSym[2],FormulaSym[3]); 2 E$ g' a3 ~: @# i; t( U2 v9 F& D ShowFormula(FormulaNum,FormulaSym,num,sum); 0 v8 s0 W. J- f! |- h. X T result++;* V8 @( P; m' h- {4 q }9 W4 H4 h( @2 \7 }) ]: @* E 2 M+ o6 @8 |; H3 H, m) I // 依次穷举操作数1 L. N2 t% o+ j2 i j0 n! ^ 0 P# e2 g$ h* G2 a+ P, R- j4 B //允许数字重复的穷举 " L- O" W8 O ?! c+ \ //FormulaNum[0]++;! @' H# G2 }: f; c6 b0 A- B5 a) u4 }4 Q //for(i=0;FormulaNum > max && i + T# ^. V( u. Y( x1 ? //{' P+ @3 o9 {6 G // FormulaNum = min; # {# s/ @8 r" p // FormulaNum[i+1]++; ) I9 V( Y: ^' u/ @ //}' x& Z# _" k: z& }2 z // 操作数穷举与操作符号穷举联接 * ]( y$ B4 y! ?( i //if(FormulaNum[num-1] > max)+ w, t; z% a' s/ P! q: B9 P //{9 f* t) Z! W2 s c6 T$ x // FormulaNum[num-1] = min; 7 N( `) ]2 e! K" b! Y9 ` // FormulaSym[0]++; 8 [8 t4 V, L3 m3 [5 W8 K# ]: p- b% l& m //}1 |1 a* e$ E! u3 q$ b8 | 4 f% \5 ~: Z% V* N! ^ // 不允许数字重复的穷举 % R) t7 v, H# f* X // 数字必须从小到大的排列,防止重复 ! n& f5 J8 Z& q; C7 h" y; C7 B7 h if((max - min)< num) exit(0); // 出错+ `1 Y2 \0 ]( Q6 h) u' O1 }* Z# G $ V6 T; Q: a( ?7 @* g* A if(EnumArray(FormulaNum,min,max,num))2 ~) d( ]9 ~! \' f7 g1 | {3 F( [( B/ N3 v. I* V9 N/ A+ K }" h FormulaSym[0]++;# L4 y7 e1 o# D$ [0 G' U4 R5 d8 |9 { InitArray(FormulaNum,min,max,num); . Y+ e$ l$ @* L FormulaNum[num-1]++;8 n* W8 n; ], x/ d8 v y: J. [& l! g' l }7 D: E' U' I4 m$ ` ! t3 R+ E# d" u" m" b // 操作符号穷举8 Y) C$ O6 ^2 n. c; E. F for(i=0;FormulaSym > 4 && i" G8 I/ X+ ~" b1 o# `5 i {! y+ s7 b% z& r& q% |7 s FormulaSym = 1; ; X# W/ |, I2 _ w FormulaSym[i+1]++;! f# W7 \ Q: P } ) C4 E+ W) N+ m" q# s: I# Q* X7 G5 g5 N& a8 _' h8 n } 0 P" Y& E B/ s* t2 g; O //释放空间 & @# N& x0 O0 ~: q free(FormulaNum);# _2 A/ z& U4 @6 {. j2 b" R( I# L free(FormulaSym);. T4 l: v( E; j# p1 ^- }/ m7 @ return result;$ s. d3 X& |6 G+ x N } # w& z; B' T; [4 n8 s; R// 计算算式结果 B% q0 l6 m$ @, Q7 b* X( S- W) M double GetFormulaVal(int *Num,int *Sym,int count)% q( L. _0 p! J { 8 P7 C" j8 i8 j* r7 H& N% `$ `5 q int i,j;7 I- f( @/ T$ O: y0 M$ I" i8 k# p double preresult; p) ?: w! F5 t$ c, D* t+ x* k) e preresult = Num[0];: D* h$ H. W; \" o# s i=1;j=0; 3 I4 {/ k" V/ A9 s8 U& E while(i; ~/ ?; l0 O: J9 j- M5 t8 ?& n {% ^, m* K& c) }4 l8 x3 H' F9 } switch(Sym[j])" ]* o _% M1 c: u! s5 m {6 ?+ `9 w) W! b case 1:. U1 g6 |# G: @% q) o) |- [9 ] preresult += Num; . a7 B9 L; [8 C break; + d4 T- \) H4 M; t% F) H( c& q2 [$ k case 2: 7 t" Y& @" `9 d. j) }) D preresult -= Num; . Q/ |+ j0 E5 P9 { break;/ ]- E9 \; J. J( z9 p& k case 3:- G9 ?2 t! l6 d- Y( G+ |8 p( W5 z" {! u preresult *= Num; & D' B3 j! v2 r$ ~* g0 A7 A* |) y% | break; 4 V5 |2 U0 [5 X; x4 ^( p+ R' k case 4:! T# @7 M' T% p9 E9 z8 M if(Num == 0) return -1000; 9 `' d+ F4 ^! s preresult /= Num;1 `) X+ c0 [1 Y break; " n2 G6 M4 L8 a: X% {8 g } 6 L: O# B7 H$ S3 V: N: [ i++;j++; & S8 ^* T/ K. o- t2 ? } 6 {8 h! Q6 ^$ N: l return preresult; //进行修正, {4 g" ~% s0 h }+ |! r1 f5 k+ P' t4 @! t // 打印算式 4 n, E0 p8 J6 T7 ^/ Uvoid ShowFormula(int *Num,int *Sym,int count,int sum)( N- J- t5 T$ p2 f+ Q$ W/ e% h# x { ' R/ r! f" Q' K' H z2 m: j2 _+ d8 P- H4 b& b |( }; ?/ z int i,j,len; ; g) {9 C" G! E( b6 ~ char *Formula = (char*)calloc(count*4,sizeof(char));( X) Z" J1 ]# O, N9 [9 {% J char temp[10]; 0 q% e/ k: C5 j8 K! o2 |- ^) T itoa(Num[0],Formula,10); ( x! Q- w8 b9 n& r W* x( o# _ i=1;j=0;% u+ I" F1 B7 Z( r8 ? while(i" z' p- ?; J' s+ p4 l: g {; \( A4 ?7 I$ ]: i itoa(Num,temp,10);" x4 m- e7 E& x7 y6 g4 t3 K' s len = strlen(Formula);! M1 x$ V- \; K switch(Sym[j])# r% t# }/ W, ] { 3 j* X$ F# ^" S1 `! j5 L case 1: 1 Y* L9 P! K3 {# T1 e3 G. ~ case 2: 9 v' ~4 e1 t7 u- \ Formula[len] = cSym[Sym[j]];: n* W! x0 ]3 L& S; S' q- ^$ g2 e, i strcat(Formula,temp); " i- y! H- {9 M( u' ` break;1 e/ h3 @. F4 Z2 c case 3: 4 d: N' _+ A! w case 4: & g/ O. w5 @+ O5 H7 G) Z . f5 K8 C, b8 F& K: |: y // 如果上一个操作符号优先级低于当前的,应加上括号( R/ D# \( J. ~" l! O8 r- E if(j==0 || Sym[j-1] > 2) ! ~6 }& \" v1 d3 I2 s {) T, u5 W2 y' x5 ]0 |0 H Formula[len] = cSym[Sym[j]];7 h; P* W X. ]: }4 D4 q5 g; G strcat(Formula,temp); & R8 D# R( |9 M/ h }1 H- E( R, {& N4 g* X9 C- U1 b else- s- _$ ?# [1 u. g { 0 `$ J4 A$ H0 ?2 C- o$ C int n;$ I; p! [" u k: q) G9 b char *FormulaTemp = (char*)calloc(len+1,sizeof(char)); - k5 C! L E' n) q for(n=0;n* S/ K( D$ m' {0 s2 X1 k3 K { G: G) Z r5 w) x FormulaTemp[n] = Formula[n];; }/ I. ^ O' ?. y* l Formula[n] = 0;3 _1 X2 a2 _. x5 o" i }0 o9 E, y1 f' i- C$ R! B Formula[0] = '(';* K! ~- F4 ~) O4 o% h7 P; {0 N strcat(Formula,FormulaTemp); 2 N' s3 u" `; q8 n free(FormulaTemp); + z. w$ @2 o2 l Formula[len+1] =')';" e# S% P+ y3 c$ H* u Formula[len+2] = cSym[Sym[j]]; : b9 k: I5 H. B strcat(Formula,temp); 0 s# G: y: p7 @9 U }( D8 ]! N4 F D0 t* } break;3 V/ c f4 r" t }& R5 {* B3 R2 P6 B p' l i++;j++; ! }* M; K( J- q1 s5 N5 @, X } , r( L* Y% c. Q4 g printf("%s",Formula); 0 F* y, G, l8 v! v7 ?4 q' I1 U printf("=%d\n",sum);0 S5 ?- x1 Y) K. {4 y. n3 }3 R free(Formula);7 o5 A# s- i. b. \6 `( Q4 e }; v8 f0 H0 p( o$ y# K( V+ x ) B- C: X, q4 p6 V) g // 以当前数组为基础得到一个从小到大排列的数组% u* J( u- l8 C _- N0 O; z // 返回非0表示穷举结束* ~3 o6 D' I& Q( y9 S/ V. u- j int EnumArray(int *Num,int min,int max,int count) 0 ?, v5 O' d: j, Z/ Q4 c- }{/ L/ B4 r* G( t* g int i,top; 5 H( g4 P5 O3 I. h$ K, t3 ?% R8 y! v top = count-1; , y( m3 Y) q: W7 {) A" p Num[top]++; ) P4 j( {4 U( A. W8 j while(Num[top]>max-count+top+1 && top>=0); {# ^+ g6 T+ o* K( Q { 5 t, j! a+ J! X& X top--; : n4 {+ A9 r8 r9 O Num[top]++;4 b6 W; q Q5 m7 _7 h- u0 P4 h }3 \! T: w+ V1 y" V$ _" Y! X( j) ]+ J+ | for(i=top+1;i# t; P) N4 |1 G6 t" b( s' ~, k0 q { / T# H5 s' @8 Y0 V, V7 e1 ^+ E B Num = Num[i-1]+1; a1 d, v1 E% J! K8 {% b9 r }# u$ }) b* q4 z3 z if(Num[count-1] > max) return 1;& c/ r# Z9 q A- V7 f1 s else return 0;6 R: R' A0 S/ o } 8 |, o) ~) j) J j0 \" K( B- A) m7 s. l, W% P6 u // 不允许重复的初始化数组 $ X" w8 D8 W, g( svoid InitArray(int *Num,int min,int max,int count)1 r1 {# M% e% S9 A' \ { , @$ \+ q1 x& ^( m, M int i;* w6 `0 j0 h# I7 A4 c% q2 M8 \6 C) Y" x for(i=0;i=min+i;! I# M8 Y, x1 }1 o7 v Num[count-1]--; ! u# ?. v0 p. g4 y5 I) r0 f$ W0 P% o}0 d0 r6 v5 ~ i" H" ^0 v* D ( B+ T9 i, Y4 E ~9 _9 |% B, M& u5 j! b7 p8 I2 D. |% a1 w) [2 T7 v 4 ^1 X7 O) e9 [4 p' _
    [此贴子已经被作者于2004-5-2 14:50:47编辑过]
    " I Q; H9 ~; Y. ^% z' [

    该用户从未签到

    11
    发表于 2004-5-2 14:54:00 | 只看该作者
    本法穷举出所有用min - max之间的num个数组成算式,结果为sum的情况
    # t: o9 c* q, q* Z: e) V& z1 L4 K5 r0 D4 v$ w* [, V0 C0 X
    如要具体的话,可以不穷举操作数,直接输入操作数,进行操作符号穷举
  • TA的每日心情
    奋斗
    2015-9-17 00:58
  • 签到天数: 1 天

    [LV.1]初来乍到

    12
    发表于 2004-5-2 15:17:00 | 只看该作者
    以下是引用游侠无极限在2004-5-2 14:41:26的发言:( r" ?$ {/ R, j0 i5 Y #include 2 n1 \3 ]( { m+ n #include ( o" {; F9 n- G9 l/ X: [; `; p int EnumFormula(int min,int max,int num,int sum);. d# b, w1 k' Z3 |0 e void ShowFormula(int *Num,int *Sym,int count,int sum); - k& S* A+ F) K) P3 E9 h double GetFormulaVal(int *Num,int *Sym,int count);. I: u6 | Z6 w int EnumArray(int *Num,int min,int max,int count); 2 D% O) [) F N( F; G! e+ N4 C+ Z void InitArray(int *Num,int min,int max,int count); " R; X V0 a/ ` const char cSym[5] = {0,'+','-','*','/'};- a; A% D( A/ H7 B ]* ^) l ' m$ r/ k- E" `0 p( u, G int main(int argc, char *argv[]) 1 s; X# y( m8 N; ]: R { 2 W3 t+ i7 u8 N* d, k: l5 L' z printf("总计%d个式子\n",EnumFormula(1,10,4,24));! Z0 B3 Q% a1 l1 W: F system("AUSE"); " D9 v0 i. S' ]& R& l3 Y! o8 N return 0; $ D0 \; W. f- S, F5 c } + I+ j- O7 w. H' f5 R' q; h& ^! s% v/ s int EnumFormula(int min,int max,int num,int sum)" K5 c9 U9 Q$ n$ [. A# Q* f' V {/ z; g/ P$ [: q int *FormulaNum = (int*)calloc(num,sizeof(int)); //储存操作数 : h& t% a( _" W2 D j //储存操作符号% ^5 C4 {# W, o1 F //最后一位用于穷举结束标记 , h% y2 w# @" \, p, t1 ?) V // 1 - 4 代表 '+' '-' '*' '/' + d L4 ~& G n5 N' v int *FormulaSym = (int*)calloc(num,sizeof(int)); 8 ^1 G8 u b9 c* B- B, _. U8 Q + X8 @ j0 N; H' y: l. O int result = 0;4 Y' d1 Q7 T% Z // 初始化操作数和操作符号数组% t2 s9 N2 ]3 P- _2 G; v! C) k $ y& d/ Z# i# g* w) h& y' x; ^ int i; , { T! `2 [2 f# g. n- a Y 5 ^9 S; j) N: F' Z% B- `$ V6 q- | for(i=0;i = min; $ s+ s+ [; c0 D9 D4 s/ {. [ for(i=0;i = 1;$ `& _7 P8 r+ g/ Q' A) D3 Q FormulaNum[0]--; $ E3 Y2 i- B0 t 1 f# I2 p2 b5 r' H y InitArray(FormulaNum,min,max,num);5 I% l6 v( h& O, S6 w FormulaNum[num-1]++; 6 j$ w+ m. K3 I! P8 w$ \ // 穷举操作数和操作符号组合 , I+ S- c' m" C. a while(FormulaSym[num-1] == 1) * ^, H8 |1 G- s) N8 Q {+ @6 x: _2 z7 }' a% }) l4 g- ]* _' N+ [ double t = GetFormulaVal(FormulaNum,FormulaSym,num) - sum; 3 W. e7 U4 {* j0 | if(t>-0.01 && t<0.01): a3 N( q# |* T6 P6 S { # _! a k* V" T" g: G/ Y) x& j# D //printf("%d %d %d %d | %d %d %d ",FormulaNum[0],FormulaNum[1],2 a) r' c& g% A" u //FormulaNum[2],FormulaNum[3],- T; m* _5 N" p0 c, [ // FormulaSym[0],FormulaSym[1],, n7 i1 B' _. Y6 O! { // FormulaSym[2],FormulaSym[3]); ( W4 s( D1 {6 X* @3 v4 G. C# ] ShowFormula(FormulaNum,FormulaSym,num,sum); " z0 c. a; P' h5 P7 `5 F result++; " D6 k' ` m& b4 s- z1 C }! C: @, C7 V1 x0 V9 ~% t $ D0 s& o$ g* g8 Z // 依次穷举操作数 5 o2 S8 s1 T; }0 x 4 _# J# G/ k# ^ //允许数字重复的穷举 ) i6 f" p: c- \& c! z4 P7 a# B //FormulaNum[0]++;; z* [: F5 ?2 V2 T/ w0 J //for(i=0;FormulaNum > max && i 6 s( l. j; W$ j2 E8 ]# G( f //{ 5 F, R1 j/ f/ R* A0 U1 h, B- v* O+ v // FormulaNum = min;8 s; T/ ]; v/ Q: c! \ // FormulaNum[i+1]++; % w( @" m% b1 r- ` //} 5 n& w# d: L4 I // 操作数穷举与操作符号穷举联接/ K/ y9 i0 ]& I# E5 c( v% } //if(FormulaNum[num-1] > max)3 _5 Y7 S0 r) a8 m //{ 9 j/ z2 H& J" Z& P# E8 M // FormulaNum[num-1] = min; # \# M" u. T; p3 ]% v, F. ?7 q# t C, U // FormulaSym[0]++;% y, j: l( r: ^6 v //}3 {% D( L% D/ q ; P. E W- @( @# o9 g // 不允许数字重复的穷举3 T! M% X+ l' j, _ // 数字必须从小到大的排列,防止重复5 W6 R- F3 S3 ~ B, C; u if((max - min)< num) exit(0); // 出错 " t$ n) g$ d' D( L' G : o# R# l7 K/ I" k if(EnumArray(FormulaNum,min,max,num)) : u: F) H- G$ [8 A9 t4 x* K { ) f6 q7 C" [' g1 \4 W6 X FormulaSym[0]++; " ^! x/ g2 |6 C5 `' A5 A InitArray(FormulaNum,min,max,num);0 y( s: S: `1 v* R6 R! _; w; t FormulaNum[num-1]++; ( s3 G3 w* M }! u- S }$ J( ^, O! s* c ; W. I; S' M; ]% Z3 j5 P3 L) L& z // 操作符号穷举2 w h4 ?! n" }4 I for(i=0;FormulaSym > 4 && i" t% J6 {: ^7 t: G- d) | { . K" k8 P. _3 n0 y/ i# H0 u3 ` FormulaSym = 1; 7 M v7 E$ a( s% e1 j. h8 @" p& { FormulaSym[i+1]++; 8 q$ f0 v# B3 e: Z. b" U+ m4 T' O } % {9 k# B6 Q$ M. _5 D7 T0 Y+ _) z8 f A% \+ n0 [/ v: e }( a; ~" t+ M& t7 u9 S //释放空间/ [# W" d; N( c free(FormulaNum);- F4 b2 p3 E' w9 b# T0 [; i free(FormulaSym); , ?6 i; ]5 O h5 r" h/ F$ p" J return result;/ @2 J; i8 B+ Z- H7 c% d } U" T( o& E ]( Y0 t) R' j // 计算算式结果# S/ a; y; h5 N6 }8 E double GetFormulaVal(int *Num,int *Sym,int count) H' H# }6 \+ a. s+ b3 y% T: K1 r3 ^ {- b; u* o* s: F int i,j; % e$ v# `4 @7 ~' N: p7 A9 r9 @/ p! Y double preresult; : N8 g1 E& B9 m( o( } preresult = Num[0]; 0 O! X3 \; J8 w: ?0 }3 |3 l i=1;j=0;* q" f* ] \2 R! J while(i# f3 B6 ?/ m9 [" _+ V { - a- r* W3 ~. a2 t6 p/ { switch(Sym[j])% C; Y. h7 R5 K! @6 A# m { - F0 @0 Y' i) s% d5 A U0 U, B M case 1:8 S6 D' t+ `$ z& k preresult += Num;$ ?+ b# _* g. I7 ` break;, Z6 g' I5 G5 }% V( ` case 2:* m2 N4 T9 \# S: X4 p preresult -= Num;9 f' j4 b) f" @& S& Y break; 4 E- f8 r s' v9 U! u, e case 3:, Q1 @- \2 N @ preresult *= Num;! [1 L$ o6 N: m$ w+ k8 A7 X( N4 k2 c' B break; ; o% F4 f# B* K5 D* M D case 4:- {, E6 a+ B8 \7 ?! i if(Num == 0) return -1000;. R* w6 p$ f& R G preresult /= Num; _: v4 u# m0 |8 j break; % T- V; s% ^* x } - Y* d/ M$ ^! R( P6 i i++;j++; 3 s# b3 O: Z* i" [ } ) T, I8 ?( F. m) G4 U3 n- } return preresult; //进行修正 T* E2 N9 q. q) w R } $ R. x9 ^ m! y1 ~+ h // 打印算式7 B' K; ^0 i6 g7 w void ShowFormula(int *Num,int *Sym,int count,int sum) + W1 w4 |0 G2 ^* |9 s { / j3 b- g2 S; B7 |# i6 B% E) X 5 W0 Y9 H( p. r* A. [ int i,j,len; ( ^! `7 A; G/ f2 |) } char *Formula = (char*)calloc(count*4,sizeof(char)); 1 A! w* H3 a/ y: s% D# H) I: V# D- z char temp[10]; 1 T+ y( l( O+ ] itoa(Num[0],Formula,10); " n7 [1 s- b; |7 p7 T9 L i=1;j=0; - T( |; @" D8 Q while(i; S ?, F1 O0 z { 9 [1 g1 M `" q. m6 B itoa(Num,temp,10); 5 F4 f" k. z( j0 h+ u N! F! `6 h len = strlen(Formula); + D# p2 u/ j1 [ switch(Sym[j]) : j+ W: U$ a( Q% L+ p {: \. h% S- P1 M# s case 1:8 c" d$ ?# Q2 f$ H case 2: ; o7 S, ]9 R6 l/ @! L Formula[len] = cSym[Sym[j]]; B' W( W8 O9 p5 z' D3 e" l$ @ strcat(Formula,temp);* Q% [" \# @9 }1 F. C+ w. b+ q break; ; _, B" X! ?; T1 v4 { A. E, v case 3:, e5 ~2 w- o; h case 4: * m0 j6 t' ~0 R* x; i% O# k 6 ^+ i* B4 J6 I! J( j // 如果上一个操作符号优先级低于当前的,应加上括号) v e% Y3 L; o2 `: g if(j==0 || Sym[j-1] > 2) / Y, e$ t5 v# Q' {5 X4 N { 0 b; I6 ^+ m, _% O! F6 f! c$ a# k% f Formula[len] = cSym[Sym[j]]; : c. R, c% n q4 _" G% U strcat(Formula,temp); 4 t6 A' O" J" z- } } 1 G( f' Q- q" H else : A* Y5 D( x# W- Q { . S: K4 b) s+ _7 w- x3 J0 q" V4 `6 L int n;- o* o O1 H' j* x char *FormulaTemp = (char*)calloc(len+1,sizeof(char)); " ~" O8 z/ x# L, \( i- ?$ ^ for(n=0;n Z% v) u2 Z. g6 ?; i& P/ Q { ) [9 c3 ]5 d3 H5 c6 R! v. }6 N( Y FormulaTemp[n] = Formula[n];) _: ]6 b5 N# r0 ]3 w/ F# E Formula[n] = 0;4 F+ A9 K5 n0 w; s6 k# v3 ~$ O } : ?$ p+ {9 X4 e" I: Z& K( i Formula[0] = '(';, {! P* {6 N" ?0 S' ~ strcat(Formula,FormulaTemp);) f) {, h- m/ q8 S; n1 E6 D free(FormulaTemp);0 j+ n( q& h% [8 Z7 b Formula[len+1] =')'; 3 A: J9 f% f, h6 ?" v8 L3 h Formula[len+2] = cSym[Sym[j]];4 e- R" p, G# b1 _3 G* p strcat(Formula,temp);# c. ~2 z: z/ x7 V" m5 D0 g, u } 7 c* z, C+ _2 I7 N! {& a7 j break;2 K# t9 F* j$ [. d/ Z. Y# p+ a } ' i) Y1 o" D3 C# [9 E7 s, y$ D; N i++;j++; * s" i' O* w% J) {/ A } ( n* z2 w& ^$ @+ l printf("%s",Formula);& D1 a/ R1 f( d& d& Q printf("=%d\n",sum); # t* }! T p2 j" i* F* |/ E6 w) U4 { free(Formula); 7 l; J% o1 l5 F+ D Y' c }9 ]( x, {$ ]' }; ` 5 q' m5 p! O v/ X# w, v$ ~ // 以当前数组为基础得到一个从小到大排列的数组$ k( V. ^6 }% u) z // 返回非0表示穷举结束 , ]$ |9 A$ w) c3 _. Y8 R int EnumArray(int *Num,int min,int max,int count)- I5 p0 k! U8 B2 z {! V& W4 E1 l# D4 m; K; B int i,top; " d1 O4 t K6 Z/ z6 V top = count-1;+ O) n) x+ y A) P1 |/ u2 F: ]& G Num[top]++;# v( m6 O y; I; P& ~) ] while(Num[top]>max-count+top+1 && top>=0) ' g2 x- C6 R i. x; Q) p+ O { & h' _* S; ?# f5 h2 N& u top--; ( g- ]/ w e! V3 n+ H4 C Num[top]++; 9 b* Y! z; z* n E8 ] }2 x; c4 l# j9 Y for(i=top+1;i j. K. f. r5 H+ O4 K { # }5 j7 k" U8 U) D5 b" j: A; H. w0 K Num = Num[i-1]+1;% M) Y. Y) [. x9 T$ E: G } ( _" E7 G; L! M! m3 G: M) R2 s* ^: O if(Num[count-1] > max) return 1; . J X" C5 o2 `3 G8 j' s1 N; Y2 s. m else return 0;! ^$ H7 i+ M. @0 v0 P }8 y- U' [6 y0 P ( x! ^" W% z$ h# n5 K. s // 不允许重复的初始化数组 ) n9 V# Y8 X, C/ N9 e2 O, W void InitArray(int *Num,int min,int max,int count)# x6 `% M+ X& y( f; ~ K { 3 u8 j Z* I* Z# l int i;5 `0 r0 j9 m* a; U) f for(i=0;i=min+i; , S8 K6 m/ [5 o0 j: Z" Y Num[count-1]--;% M+ o( B8 z, C }* y3 F) G3 Z$ G% w8 s , R+ u3 p1 g5 y % Q) E+ S$ S6 Q- k. H) b, z5 B+ e# _1 Y5 G+ N s( E( J8 _# C7 U7 A
    [此贴子已经被作者于2004-5-2 14:50:47编辑过]
    % [0 B9 {2 T2 A" L! Z3 l " E% _( k0 e+ l1 p! G1 ]. @+ L+ B' B$ Q4 pprintf("总计%d个式子\n",EnumFormula(1,10,4,24)); 的运行结果是:7 N+ F- M/ e# X: W; i& c: C 1+4+9+10=24 0 E6 e2 f' a. I- C9 i O1+5+8+10=24 2 P! A) ^- o! G6 T+ C1+6+7+10=24 0 B. M( _, b8 [$ z2 e$ |1+6+8+9=24 % L* u& E6 J, ^2+3+9+10=243 ] C) e+ \3 X! f, ]) q; k2 y 2+4+8+10=244 S6 l7 I6 V" Q( l6 J 2+5+7+10=24 + S0 a3 [5 e. B& z+ |( d2 |$ K2+5+8+9=24 2 O s% H+ k0 }7 f- `3 ?8 E6 m2+6+7+9=24 , x. z: e/ q( r& g3 G1 A3+4+7+10=240 N }, z' u4 @) j! T5 s# [' r 3+4+8+9=24/ {5 U( Y n0 F 3+5+6+10=24: H2 d$ k* d+ i+ g 3+5+7+9=24 z" s# D2 l# h) l& H 3+6+7+8=24& }7 a! `( N2 ~: t* d 4+5+6+9=24) U. ?. _3 E- j W c8 P* | 4+5+7+8=24 5 A; ] \3 s" l9 j( z这是什么意思?似乎是找出了 1 至 10 之间的和是24 的数据,这和完成计算24点,差很多吧? ( A/ t* A, e; k; J# y/ l比如用户输入 2 ,5,7,8 程序应该能得到计算这四个数据得到24的表达式才行啊,这样就可以写一个游戏了。5 u$ {- f4 x: f& T& v8 N 如: 1,5,7,8 有如下方法可以算出 24. P- X1 R3 t7 Y3 b ((1+7)-5)*8 = 24 M9 i0 n4 P+ X+ w' p: }((7+1)-5)*8 = 24 8 x& `/ w. o5 u: h(1+7)*(8-5) = 24; M, E9 B1 S- ~3 @% `) Q (7+1)*(8-5) = 24 5 z6 P3 Y0 x" D; i2 D3 F& S((1-5)+7)*8 = 24 " [7 I; s c- w3 N% z ~((7-5)+1)*8 = 24 . E6 j8 K* z$ `5 ?# f(8-5)*(1+7) = 24. d7 X- J1 [: p$ Y0 J (8-5)*(7+1) = 24& l4 J6 P. j' }7 _ M9 l O 8*(1+7-5) = 24 % m& L! c- ~5 o7 G! h6 `$ {8*((1+7)-5) = 24+ t) s6 x$ ~- N- J$ d8 D 8*(1+(7-5)) = 24) p' Z, G9 a4 }( v! I 8*(7+1-5) = 24 ' m% X2 v) J1 N% c8 a8*((7+1)-5) = 24 # U# g5 y5 A' a8*(7+(1-5)) = 24 6 V2 S+ _. x4 W; ]9 C, u, L; M8*(1-5+7) = 24 * z- V" O5 m; p8*((1-5)+7) = 24, [$ F* f$ D/ j/ t1 u2 B2 t, D 8*(7-5+1) = 24! r6 U" E' g+ S& ~( G( G* ` 8*((7-5)+1) = 249 E/ }! G/ g7 O# I

    该用户从未签到

    13
    发表于 2004-5-2 15:21:00 | 只看该作者
    结果是这样的:& Z+ s/ Y% s5 Y6 L7 Y
    1+4+9+10=24
    ) v2 a& `  n2 K; V1 `" g/ K# D- u( u9 s( |1+5+8+10=24
    9 o/ q. ?7 Y2 s4 u1+6+7+10=24
    % |% d1 H6 H" _" y1+6+8+9=24$ D4 ~& s  P3 O  |; y! B
    2+3+9+10=24
    ( w5 ?$ n' g- z$ K) \2+4+8+10=24
    & t& f9 w; _1 v7 a7 Z+ C: F2+5+7+10=24
    / @3 ?$ M, e: k; P& ~* p, G2 I( K2+5+8+9=24( W6 [3 M* F! @! i+ x" J0 }  j
    2+6+7+9=24+ |8 ?# \1 c( Y( \$ M& d
    3+4+7+10=24
    . N" @* i/ s4 b9 ~3+4+8+9=24
    . o( y$ a( a/ k4 N% {5 i. _3+5+6+10=240 }  J/ k- o5 r1 Z7 |3 o* k9 Q
    3+5+7+9=24* V% o$ O. ?1 U6 y& H
    3+6+7+8=24
    8 @/ L& g) i" a$ m& C% J, t% g4+5+6+9=24
    " J& b1 b5 r- M2 S/ N  p" F, p4+5+7+8=243 l% l& k9 |  H, S/ w& Z, _
    1*5+9+10=247 t5 F5 c$ h: R$ @; Y
    1*6+8+10=24; a$ S: v6 O9 }5 j+ @0 _0 P/ c
    1*7+8+9=24
    0 B( q' b" j0 o6 u' e" F3 t0 K2*3+8+10=24% u( c5 k7 g+ F" Y& g! R
    2*4+6+10=248 M# ^8 R& d# V1 B
    2*4+7+9=24, t/ x+ ~$ c+ N
    2*5+6+8=24
    ; o* x3 w3 O' Z" v) }& m3*4+5+7=248 \0 ~) p: x4 p1 t+ z
    4*5-6+10=24
    , _* Y+ e" _0 ^9 Y8 M# V3 j. f' d(1+2)*5+9=24
    : m) z' g' M, C# I(1+3)*4+8=24
    : \8 Y: A8 G' {! I1*2*7+10=24
    : E9 s7 P1 X2 l( F; O1*3*5+9=24* K/ o2 D: E8 n/ @" X1 ^
    6*7-8-10=24
    6 L7 `! Z& v8 |+ Q& i5 M(2+4)*5-6=24
    9 g: O4 c; D7 x) i2*3*5-6=24
      Z; u5 k# h' s4 g+ T) J' u+ i(1+2+3)*4=24" M9 Z$ `9 K* k, y
    (1-2+4)*8=24
    ; n# P& R+ [) s(1-2+5)*6=24
    ) J4 H2 T) H' t# |) k* H( ^(1-3+5)*8=24
    3 G0 M. X  h7 [% w! O(1-4+6)*8=24
    . I6 y/ }2 l9 o4 H% y9 ?$ A(1-5+7)*8=241 g. Q: J( `8 u; W
    (2-3+4)*8=242 B/ z- J3 _7 T; H3 k4 Y
    (2-3+5)*6=24
    ; [( Y5 i2 K( q: P& n(2-4+5)*8=24
    + U& a/ J& f5 F' y& V(2-5+6)*8=24
    1 {  x& h8 m& c( ?3 A(2-6+7)*8=242 ]5 r, G$ _4 d
    (3-4+5)*6=24
    1 O8 S, H" e% x7 F1 i4 ?(4+5-6)*8=24
    9 D9 ~3 B" ?$ R2 e" Q2 n(4+6-7)*8=24
    $ E' C$ ]8 O* t6 M9 d. W; d(2*4-5)*8=24
    ; I" |% [$ s/ s# ~- P% H(2*5-7)*8=24" z. i  M- S3 `4 {/ h
    1*2*3*4=24
    % j1 Q8 `' x, `" N% y. i1/2*6*8=24
    5 u6 x! ]: l! T' H1/3*8*9=24
    + H1 z2 I' A0 @5 j8 h$ H  {7 o2/3*4*9=249 e; k' ^* T" J* I
    2/4*6*8=24$ P! t5 }2 g" I  d! ?9 T
    2/5*6*10=24
    + P' n# a7 t2 n& k- O0 z2/6*8*9=24  c) W. h. y+ C) {0 W
    3*4/5*10=242 m" N* [2 w( B  H6 p- g
    5*6*8/10=248 j, s9 t  P, A0 T+ U. b2 z
    总计57个式子

    该用户从未签到

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

    [LV.1]初来乍到

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

    [LV.1]初来乍到

    16
    发表于 2004-5-2 15:28:00 | 只看该作者
    (2-1)*3*8 这个算式你就没有啊,这4个数字的组合都没有出现, R* Y2 I/ e9 Y& b5 n3 `, R
    , \/ v% R9 Q9 {. e9 r6 f- ~
    5 N/ q+ N" N5 N( U" L2 n0 x
    # x5 p2 e& ^" O1 }$ I+ `
    . ~- N4 j7 n; K( ]3 ]+ T

    , V6 n* T4 i6 H. ^  \
    # a6 w/ E  i4 H* |0 k
    [此贴子已经被作者于2004-5-2 15:32:12编辑过]

    6 k8 @* g! h9 r" D) R
  • 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 | 只看该作者
    ; X+ i* z& p- X% y

    3 o  j1 Z; I, ^1 B- i用这个好了,只不过输入的时候要按从小到大
    ) @- H6 ~4 q2 q5 U: G
    $ U3 r4 X" H8 P3 X8 s; i& @好象有BUG,我暂时不太清楚

    该用户从未签到

    20
    发表于 2004-5-2 15:38:00 | 只看该作者
    以下是引用yzhlinux在2004-5-2 15:28:15的发言:/ L  T! L$ J/ {- \& v( t1 ]/ b
    (2-1)*3*8 这个算式你就没有啊,这4个数字的组合都没有出现
    ) m7 C  ~* O9 e8 @' \" X
    ) ~2 h) z# e0 R& _1 ^* I
    本来为了防止诸如0 t$ o5 r) a( o- W+ I
    1*2*3*4& j" ]2 N: r* f
    1*3*4*2- M) ^: I7 `  b
    2*3*4*18 w8 H7 W# _8 p) `- i, N) e1 E
    等的重复,只使用了从小到大的数组,不过这样好象也丢了不少可行的式子' w. D8 V: e0 U, O, J
    * X: S7 _+ n4 r" G
    另外你的程序就是有这些重复的
    9 \* p  }" e8 [& t
    * S: }! b! X) e0 J$ @/ D: O2 x5 }PS:VB的程序感觉就是慢好多啊4 {9 f7 e( Z+ i8 \$ N
    [此贴子已经被作者于2004-5-2 15:42:01编辑过]
    . H3 k" L. J+ K9 i. I$ s5 Q; R

    本版积分规则

    关闭

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

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