下沙论坛

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

QQ登录

QQ登录

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

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

[复制链接]

该用户从未签到

跳转到指定楼层
1
发表于 2004-4-27 17:53:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
就是扑克里的24点游戏,4个数,+-*/得24……, ^: S- @( T+ W) ?/ V0 u
; x% `7 z% ?1 ^( b
偶还在想……
分享到:  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的发言:6 x2 {4 v& z/ e
    穷举法吧

      K& v/ `, d3 Z" s; q, [1 Q那你的代码要写P4,4=4*4*4*4=256行代码??

    该用户从未签到

    5
    发表于 2004-5-2 08:14:00 | 只看该作者
    256行代码,什么意思,就算是这样,256行算多吗??
  • TA的每日心情
    奋斗
    2015-9-17 00:58
  • 签到天数: 1 天

    [LV.1]初来乍到

    6
    发表于 2004-5-2 09:31:00 | 只看该作者
    当然不是的,穷举是用程序去穷举,而不是在程序里先举好,并且不是p4,元素显然不止4个,至少是七个如:A+B+C+D 就又7个字符了,而穷举就是吧A,B,C,D,+,_,*,\,(,) 这个十个元素来排列组合,组合成一个四则运算表达试,然后传递给一个计算函数得出结果,如果是24 则表达试就是我们要求的了。比如:: R6 q2 t1 |6 a$ `  U% Z
    function GetMach(A,B,C,D) as String       '得到一个字符串组合如:(A+B*D)-C
    5 C. G% _" Z% u. P5 s" I/ ifunction GetValue(MachString) as Float    '得到字符串的计算值 ,可能是小数
    * k( S  W" e) P. H! k那么程序就好写了:* B$ s9 b) k3 s5 i& h8 m  Z  Z
    GetNumber(&A,&B,&C,&D) ;    '得到ABCD则四个数字,赋给A,B,C,D四个变量& ^) h4 m7 T2 ?/ F
    do{
    1 _4 z: R+ i8 `  T5 C6 D) I/ a  MachString = GetMach(A,B,C,D); '得到一个表达试的字符传1 _) X7 v1 B8 Q5 d0 f6 l
      if(GetValue(MachString)==24) break;
    ) s" H+ a8 O+ E5 \& ~}
    & t- O' g0 I% d% \4 p2 Eprint XXXXXX;0 Y% J, p7 j# w; K: B) N

    该用户从未签到

    7
    发表于 2004-5-2 11:57:00 | 只看该作者
    我现在试着在写,就是不知道有什么好办法解决重复的算式问题,比如, ~. D" L. {$ W9 ]1 ^5 p0 t2 t
    (5-2)*8*1
    ' X7 U& `3 q; K2 i, [- q. p$ P/ _+ _% ?0 x0 n
    (5-2)*1*8 . Y8 \& D9 U& `5 q2 G- g
    8*(5-2)*1
    9 a/ ~( E9 |1 ]6 |9 {8 U' _4 L1 J等等
  • TA的每日心情
    奋斗
    2015-9-17 00:58
  • 签到天数: 1 天

    [LV.1]初来乍到

    8
    发表于 2004-5-2 13:17:00 | 只看该作者
    0 z. B+ |3 @! M- i; {
    6 B/ a% a* N) W
    花了一个上午,终于完成了2 t3 {2 V$ F. G; Z) |
    你参考参考吧,哈哈! F9 h' ?! B" B
    % H- U+ F. |% c- s1 {/ c+ Q3 \/ n1 u5 i
    0 c& A8 e5 z) D4 J5 ^7 T
    [此贴子已经被作者于2004-5-2 13:43:13编辑过]
    3 w, g. A4 T: Y
  • TA的每日心情
    奋斗
    2015-9-17 00:58
  • 签到天数: 1 天

    [LV.1]初来乍到

    9
    发表于 2004-5-2 13:42:00 | 只看该作者
    上面的发现有一点bug,3 v; E) X8 v7 v7 c) Q! W
    这个改过了
    " @+ g/ I% p5 g" X一个计算 24 点的小游戏) n& _# ?& ^+ M4 h8 a
    VB 编写6 z2 Q9 ]! l% H2 y4 n5 E* r9 j

    , ?5 [9 L- X' ~8 G4 k
    , w! A$ u' d# H* J$ v) Z  z
    [此贴子已经被作者于2004-5-2 15:17:46编辑过]

    . W. k* M6 _5 g. {: }0 Z

    该用户从未签到

    10
    发表于 2004-5-2 14:41:00 | 只看该作者
    #include & b, l# ?, @. Y1 m6 h#include ( V% ?, G9 I, w- H! d7 f1 B * ~, h$ N) u& n2 r; W" _: ]& zint EnumFormula(int min,int max,int num,int sum);: x7 f5 m x( O, Y/ x0 v3 h void ShowFormula(int *Num,int *Sym,int count,int sum); & v3 K) I% C ]" _7 K- Tdouble GetFormulaVal(int *Num,int *Sym,int count);. }% M3 K3 G: ` x" n8 H" m int EnumArray(int *Num,int min,int max,int count);6 L( d1 P8 K# h5 O( S void InitArray(int *Num,int min,int max,int count); # O _' r9 f6 U+ U$ z" h5 dconst char cSym[5] = {0,'+','-','*','/'};+ t2 j6 C, I2 O% ?0 j6 G ! V$ F6 [1 N4 j3 k9 S$ U" A" l- O4 S int main(int argc, char *argv[])3 U5 w& c# T# k. J {. [: c. ^. q5 s( ^ printf("总计%d个式子\n",EnumFormula(1,10,4,24)); 9 L8 E, A9 b1 a8 Q system("PAUSE"); 1 j1 H W6 [! a2 w return 0;2 E' V: t: v: Z# W J }; _, g% T# p9 K, Z. { / m5 d+ h: H. }- e/ C2 T- p7 `; y int EnumFormula(int min,int max,int num,int sum) 4 Z: j- J! W: Q& e{( T* [& X& |1 {6 J int *FormulaNum = (int*)calloc(num,sizeof(int)); //储存操作数' a- [ ~, g4 v* y3 w! b1 ^( Y0 Y* X //储存操作符号% z! X& V4 j C. x //最后一位用于穷举结束标记2 w& m. s6 o) `7 X1 P+ ?4 L // 1 - 4 代表 '+' '-' '*' '/' 4 l* n- I0 C$ b6 g; g6 U8 F; @ int *FormulaSym = (int*)calloc(num,sizeof(int));. Z+ A P: w' Y# U6 K9 l 8 H2 W7 }6 D# {& ?% K4 o1 o int result = 0; 7 Y4 p! ~3 A' B" z8 j // 初始化操作数和操作符号数组& ~5 f0 U& d& g: v. B" a j; ^5 d8 W; m* A& y int i;! ^5 }! h" x \' q6 N6 A- r 3 U: _! q6 U. F+ g for(i=0;i = min; $ i m8 k8 _9 ~1 j! z. W for(i=0;i = 1;. \# J# B0 A) z1 ^: v4 d FormulaNum[0]--;! k/ T- D E) z4 j" j) o: u% H ! j5 x' _, _4 @. M InitArray(FormulaNum,min,max,num); + \& q6 s) V3 m J" \ FormulaNum[num-1]++;$ d5 h6 P% Z! i // 穷举操作数和操作符号组合 % d" F) q+ \% M; L' A9 o# Q3 V5 P( E3 i! f while(FormulaSym[num-1] == 1)/ e# A. n7 F# i8 d* W2 S% H { / Y. |$ g, i. |# P' Q3 Y double t = GetFormulaVal(FormulaNum,FormulaSym,num) - sum;. r6 s. c9 M, p7 T if(t>-0.01 && t<0.01)+ _% c( T( I/ U0 D- ]) n { - r0 [5 a, T/ ^! ]$ ? //printf("%d %d %d %d | %d %d %d ",FormulaNum[0],FormulaNum[1],& V- ^4 ? P$ l K6 @3 ]: d //FormulaNum[2],FormulaNum[3], # {- T( a/ n, K8 c3 n3 C- F) j5 J // FormulaSym[0],FormulaSym[1],- P6 J& S% W( q6 L. v/ | // FormulaSym[2],FormulaSym[3]); 5 K( q+ M4 N# H9 ` ShowFormula(FormulaNum,FormulaSym,num,sum);% N9 \" y2 j% z result++;0 \% N8 m* L8 ?3 ` }) Y4 O) Q7 r/ f/ i( } 3 \( o7 O" A/ {# l // 依次穷举操作数# n u6 Z) ]% }8 r" A# e 5 @+ K$ k. Y* H8 f+ C //允许数字重复的穷举/ f$ u0 I7 \! y5 }, }7 e! \- z //FormulaNum[0]++; `5 J6 j I! O+ c //for(i=0;FormulaNum > max && i( n) _$ J" z- E3 N. o4 n H //{& A5 t" ~' Z4 F3 L // FormulaNum = min;0 K- _1 s \8 A // FormulaNum[i+1]++; $ o$ U- Y, v2 ^6 @0 s: y0 F //} 1 O8 W u+ B: ?9 Q( ~+ H // 操作数穷举与操作符号穷举联接 ; h0 A+ L" {8 }6 Q/ }5 ?6 F' t% p( O" C //if(FormulaNum[num-1] > max) P( L+ ?2 K& U: } //{ $ D, s5 m3 n9 G- O( y5 J // FormulaNum[num-1] = min;: g- _" C2 }0 s6 C6 \ // FormulaSym[0]++; O4 G. |& c' A0 a& @+ S" V //} ! s, m0 s0 ]6 v! a$ ~& w$ Z' k( Q: \2 S! O+ b) Z // 不允许数字重复的穷举* Y* L7 @: A: m! X3 u+ u1 |" J3 G // 数字必须从小到大的排列,防止重复 ! A0 }; [2 V" J* |; a7 H6 @ if((max - min)< num) exit(0); // 出错0 C" |; ^/ c+ p9 y7 U v- B9 g; J ; Y2 w' `) |3 k8 G3 R if(EnumArray(FormulaNum,min,max,num)) 2 e* P* t5 j, ~ L+ [. O) ?9 \# Q {- @4 R! O2 Z, F' K6 D FormulaSym[0]++;2 i0 Q4 Q8 _% t8 E, x; u InitArray(FormulaNum,min,max,num);# ^1 |! G- F" L% T FormulaNum[num-1]++;$ c5 U/ g) V) \ } ( ~# v9 f/ O1 F# p* Z ) j/ C8 d! W0 `% t0 A0 y // 操作符号穷举7 Z0 C, z& |2 K& j L for(i=0;FormulaSym > 4 && i3 Q" B; d) c/ X n { % Q" d" k" A# l% D8 L FormulaSym = 1;9 T# Z# [" H! W1 S) ^ FormulaSym[i+1]++;: ?% O$ ~6 G. P/ `% J }5 [6 @& { v1 M/ t* H # z3 P, _4 z T' X } , A; \0 w! h0 V+ _; f //释放空间, [% \+ a# C: R& } o! W+ ^! w; J free(FormulaNum); : ^8 X% f8 L# }) h free(FormulaSym);3 D ]" `9 C' S( x0 q return result;( _& L- M* l6 R4 ~ } c) F! i8 W/ V0 A1 I9 o& ~% d2 x; { // 计算算式结果, G- S Z6 ^! d4 I. S double GetFormulaVal(int *Num,int *Sym,int count) . G! \, @. _6 _& X{ ) p4 B( K5 U1 }3 K8 z3 V int i,j; - h- B& |- k0 r/ c6 v0 y3 k double preresult;: ^! c) k- S. j. C preresult = Num[0];- m' N& y! Q- E: P i=1;j=0; 6 g; s. Z& A/ Z8 k# f6 t% l- W while(i, s G# v, i+ S {; m/ i! H- b( `: y* T, h! U: r6 q0 j switch(Sym[j])* O+ q4 e, y6 D5 L2 E8 M" O {6 _! z' C6 Q+ X" j1 b case 1: : V( p8 R* I0 w preresult += Num;: v) R% y8 H0 J k7 Y' a/ G; R F break;+ l. ^$ o* M" ~& H* D. V case 2: ! a: G2 e, @1 e7 F, v- ` preresult -= Num; & d$ \4 w2 g, x6 U4 \! u break;; ^. g+ F# z" j' W1 v; | case 3:4 i9 m3 R$ T5 F* v* G. r6 p preresult *= Num; # m$ C) e) M B9 g* y8 w break; : O/ r: a8 c F5 ^ case 4: * ^ A3 M3 n% m1 y5 E6 _2 | if(Num == 0) return -1000;2 Q, U# K2 A8 C9 [! S preresult /= Num; # p. g( {% Q2 S break;- ?. B0 `: L- ~& }1 u" h4 r9 ? } & Q W5 W2 G8 `- p8 M4 P2 V i++;j++;: H0 s+ W& W" S4 R* n n! g } 1 d. N. i- m' _9 D return preresult; //进行修正 & o( p$ ]2 Y0 \' a" r: m7 d}/ o- U1 I5 v1 ]6 ]$ y+ J/ ^. p // 打印算式! n7 w; [9 I- R9 s! S/ l6 h void ShowFormula(int *Num,int *Sym,int count,int sum) + i4 g- X5 K( e+ b" p) @{" q4 J }1 {' h, Q % ?5 Z8 s( E9 B3 c5 [ int i,j,len; ; L7 T5 V6 l, z$ R+ Z$ ]8 t char *Formula = (char*)calloc(count*4,sizeof(char)); 8 I- f5 l, W$ B char temp[10];4 q. e# I# g0 ?- I% z7 s itoa(Num[0],Formula,10);" g3 G' B0 E0 d# Q: @) o i=1;j=0; # y& }$ p& W6 ?; h5 r* H while(i3 y2 i. e) k& y5 w {' I+ C$ O+ t1 ~. ~: _( v itoa(Num,temp,10); ; t" G: ?! c2 [( n7 t0 C9 X, A. o+ w len = strlen(Formula); * Z2 K$ y* D; ` switch(Sym[j]) 0 X! N" ]1 ]2 s) ~ { i. d0 W# w. y% X. T case 1: 8 g; o' G! C' l0 t9 q case 2: ! W" d9 c2 F3 I( L5 w Formula[len] = cSym[Sym[j]]; ! }$ T3 a: v X* J/ ?1 E4 ^8 _ strcat(Formula,temp);/ ]8 ^* Z7 x; ?% @/ S; T break; ( {8 Z* M/ S* G1 u4 Z# c( R case 3: 1 G' \+ e; B/ ^9 M3 c case 4: ( v1 I3 _) B0 ?8 {, G, | 5 A. n1 z7 w6 W: k% x // 如果上一个操作符号优先级低于当前的,应加上括号 : d' w1 C8 n) Z# l if(j==0 || Sym[j-1] > 2) 8 P* e8 T; k* n/ |! o! I+ c { - @! G' {, [. s6 L: x( q Formula[len] = cSym[Sym[j]]; * u4 ]/ E+ H8 n) o3 ~9 b, c* o) g strcat(Formula,temp);. G% I6 Y( o" R } - H) L1 ~! k0 f( [! I7 v' W+ w- V else# M5 V; `" t: w { ' |9 O9 N* }* Y int n; " e) c2 I( j3 y! h% l char *FormulaTemp = (char*)calloc(len+1,sizeof(char)); 9 R) s5 V2 [' ?& J+ d$ ? for(n=0;n& o4 `/ Q: ^! |( n; V: Z. l9 L: L { - J+ A7 u& E" H9 y$ U6 ~! X" h$ Y FormulaTemp[n] = Formula[n];" r% E$ o9 E% M7 i% x- s( H: t& _ Formula[n] = 0;& @6 ?. j$ z0 {0 _7 l& \ }, b* P2 I+ m/ |. t2 X; U O6 f Formula[0] = '('; 8 T* D7 i3 {6 F6 M strcat(Formula,FormulaTemp); 3 P6 E+ c2 I8 t9 ^# ?) t) e free(FormulaTemp);7 o7 f, k% O* p2 H$ G# | Formula[len+1] =')';3 j7 m" A) K. Y0 { Formula[len+2] = cSym[Sym[j]];& H Q8 f7 s" i* r' p0 h strcat(Formula,temp);6 {0 f: i" z! `) r8 ?; ~1 T& s } 1 E( i' P/ D1 d break;0 r* Q3 r! s7 Q0 P2 s }% g5 h) {9 m0 Y9 d i++;j++; 2 {! b* H& d" P }; h9 P8 S/ y* p& n' H+ H4 N" Q printf("%s",Formula);2 M0 ^3 o- y( r: l+ q) b1 D* D printf("=%d\n",sum);& ` ?4 I! u: t! w% {/ z/ t free(Formula); - K! ~' A2 ^5 a6 R1 @} / X! b( a* f+ S& M8 o 1 |! p( a$ I" S% P8 P7 g. U3 b( e7 c// 以当前数组为基础得到一个从小到大排列的数组& T t6 ~+ I$ k+ Q9 z: Y // 返回非0表示穷举结束 7 w' H* l& j2 X2 C, F7 Gint EnumArray(int *Num,int min,int max,int count)1 `. S/ M% E% ]9 c% }3 J6 [ {% c4 o: @8 E Y int i,top; / G3 }$ R1 z9 u* l top = count-1; * F: S, s5 F/ ]/ F' Z Num[top]++; 5 n6 q7 l* i4 I* G while(Num[top]>max-count+top+1 && top>=0)6 y q2 S K; J5 p+ U5 n" H( W { & k6 l1 t9 i! ]& ?3 V# r f4 n# ?: _ top--;" L! {+ D" }0 o Num[top]++;: ~; u# ?$ m: e8 _: x }5 K; F9 D# ?/ ~" P- i* Q for(i=top+1;i D+ E# f8 e( v4 \. T' I {: E- T( S/ P; Y. B9 x8 y( \ Num = Num[i-1]+1;# a6 T: Z# k; ?* j- I5 C! j. n6 ` } 6 j' h+ r. _# R7 ]. R* p if(Num[count-1] > max) return 1; 4 D$ h9 D+ L+ t3 P5 b, m else return 0; : e6 v3 j/ \$ `- @) }}/ k; k& j/ h% _! C$ |. O : y' | V o' Z# Z// 不允许重复的初始化数组 ; d" ?! e5 ^) Z7 Z* \void InitArray(int *Num,int min,int max,int count)* N% H/ Y" L# O! t) z6 `) _8 p {+ U, R, [9 ^# s5 T1 s: { int i; 7 m& c3 N( U3 O for(i=0;i=min+i; ' z5 p6 i! w: u% l# X Num[count-1]--; / ^9 ]' L& p8 W q+ E5 S4 T* b} 1 ]" A) @0 T# e0 h( Q 9 d* X: h4 J2 T+ r6 L# T/ @- R- E% k4 C$ b6 _, } - D$ X9 o% e0 H A! L 7 W$ f1 v& i( O9 n" {
    [此贴子已经被作者于2004-5-2 14:50:47编辑过]
    7 W4 u* w' b& o, H* b7 g

    该用户从未签到

    11
    发表于 2004-5-2 14:54:00 | 只看该作者
    本法穷举出所有用min - max之间的num个数组成算式,结果为sum的情况
    7 S8 R. N4 E7 ]1 r% G
    2 H4 d. b' I" ^0 D1 R4 X% L& ?如要具体的话,可以不穷举操作数,直接输入操作数,进行操作符号穷举
  • TA的每日心情
    奋斗
    2015-9-17 00:58
  • 签到天数: 1 天

    [LV.1]初来乍到

    12
    发表于 2004-5-2 15:17:00 | 只看该作者
    以下是引用游侠无极限在2004-5-2 14:41:26的发言: $ e+ a2 k8 x" j: B/ @$ Q#include ' x! A; h! f) h" {4 M. e #include ' G( A- P( P6 Y+ E' p8 k' O! a% N . M( i' S' @3 L: _4 F int EnumFormula(int min,int max,int num,int sum);( f. f1 \2 u& R+ A8 N1 }$ L7 Y void ShowFormula(int *Num,int *Sym,int count,int sum); 8 ^9 i) [- c" V double GetFormulaVal(int *Num,int *Sym,int count); * o. {$ Z- w. `) A7 d' U int EnumArray(int *Num,int min,int max,int count);4 J! n2 X' ?6 {7 k void InitArray(int *Num,int min,int max,int count);4 H+ H5 E- F6 |& B( i" l const char cSym[5] = {0,'+','-','*','/'}; 8 j; @- ^: j+ B$ z0 Q* d# V" Q% q2 b int main(int argc, char *argv[]) / F. U% K7 z* q+ U- D& O" ?% M3 x { * J# l( ^2 j/ l: e! W! _ printf("总计%d个式子\n",EnumFormula(1,10,4,24));5 F" b! X- J% t system("AUSE"); 7 g6 r: Y: s( V2 N0 a2 c( N7 u return 0; 3 e3 Z5 A% ]% M# v, U) A }1 K+ ]' H0 ^% P u ; ]. B; [' ~$ p# N int EnumFormula(int min,int max,int num,int sum) x/ U' a/ L2 j+ D: o {4 s& v! \# n: y! l/ A2 T! s' u int *FormulaNum = (int*)calloc(num,sizeof(int)); //储存操作数# J- J1 C- i1 I; h- l/ H //储存操作符号1 A+ m5 o; L1 V9 t: z0 `3 r //最后一位用于穷举结束标记 1 P* b. E& L1 Q1 x3 U' |* D // 1 - 4 代表 '+' '-' '*' '/' ( y& C* \- s. N( P int *FormulaSym = (int*)calloc(num,sizeof(int));3 A! c& h+ c! Z" o* K, i % i9 e4 v$ F+ m; K1 C" A( Q int result = 0; 2 ?5 K( t- }6 ?: N: f // 初始化操作数和操作符号数组6 Z5 U6 Q2 E* r& Q3 a1 Y " {! j5 v1 V, o int i; " H* T0 F! p( p3 D & l1 ^0 O) C1 }" f for(i=0;i = min; & y5 y, j' J( D7 d/ ?& o, [ for(i=0;i = 1;- r' S" J# @0 y. L0 N) V& D FormulaNum[0]--;( ^" r$ u- v/ G % E1 @& S. B8 f V; c InitArray(FormulaNum,min,max,num);. A E. o O' z# e" q K/ o) @ FormulaNum[num-1]++;! Y4 r* [/ m5 [ // 穷举操作数和操作符号组合 0 K# c4 A5 P6 [6 t- W5 u while(FormulaSym[num-1] == 1): J& I# p2 y x3 Z: d { 5 t' E- c5 G/ Q+ ?; s3 p" L: Z double t = GetFormulaVal(FormulaNum,FormulaSym,num) - sum; w7 a, G) a/ S, T if(t>-0.01 && t<0.01)- S( J! L; g# x {; K1 M0 n" \4 Q: U/ k //printf("%d %d %d %d | %d %d %d ",FormulaNum[0],FormulaNum[1], 2 J2 H) j r/ a+ X- \! [2 U3 [2 P- o //FormulaNum[2],FormulaNum[3], G5 Z6 h8 k h- B, x5 u7 B // FormulaSym[0],FormulaSym[1], 2 l7 T; e; n! J0 K$ }% x$ w // FormulaSym[2],FormulaSym[3]); ; l* |2 J! u! C ShowFormula(FormulaNum,FormulaSym,num,sum);9 J5 ]9 m+ n5 P( }) y( @9 @8 V! w& a result++;( @, A6 g- h" }- h. c }, ^% G, f! N* ^ A 3 y8 Q7 d6 k _3 y4 k // 依次穷举操作数 1 s( P8 ^ s) k4 O. G6 W$ b7 b+ I4 p* q 7 { e a% K' ?2 r4 u0 | //允许数字重复的穷举& `5 E3 r* [4 [ //FormulaNum[0]++; W% P: V% D/ {7 I //for(i=0;FormulaNum > max && i; e0 J, T+ U: t7 D //{ - J( Y4 X- q9 R // FormulaNum = min;1 K+ k" Q5 I* C; i3 q // FormulaNum[i+1]++; 9 ~/ b1 @8 b( z# u. i& T //} 5 F( S9 u' O7 ^* ^# d# o$ ^) W // 操作数穷举与操作符号穷举联接 P* b/ S5 v' x% [. d2 B6 ^ //if(FormulaNum[num-1] > max) " B! \0 C. z, l' h5 b7 R% }4 `& B //{( N$ C/ F# e* R. p$ o/ D6 N0 \ // FormulaNum[num-1] = min;1 F! u1 u" i: Q5 I' L2 r% y: ? // FormulaSym[0]++;. V1 W# T2 Q$ o9 \2 T" k& F K //} 3 z( `* T% m( E+ F5 g( G% W 4 n" A/ W8 m7 X. I4 N% f; Z" K& h // 不允许数字重复的穷举 m- `) y( Z+ w0 P- Q% o5 j: v // 数字必须从小到大的排列,防止重复" s5 G: r* m$ @ if((max - min)< num) exit(0); // 出错+ \3 Q8 u1 d: P; G# v, W ' s& y0 m) Q- C& L, H" \, n* a if(EnumArray(FormulaNum,min,max,num))5 e1 C/ M. @; g. W {# t8 Y& C! B7 k FormulaSym[0]++; 8 L. ], {# ]5 j; ~# j7 X; U InitArray(FormulaNum,min,max,num);% g/ M8 _& O7 C# f) W FormulaNum[num-1]++;1 N% b. J [! @$ R% r7 I }3 k9 s J, N$ x7 O1 h, O9 G ' s( Y- Z, X( q0 }1 }! | // 操作符号穷举1 O/ _+ B7 V! G3 r) M for(i=0;FormulaSym > 4 && i) @4 g9 m4 _, s5 Z {5 ?+ a6 Q' n7 q3 v* e* y# Z/ q FormulaSym = 1; 2 _7 u3 X/ F7 h1 e FormulaSym[i+1]++;% s2 A& f* X) \* K } R% d+ |& R! t1 Q; a! Q" x8 _ : ^% s4 n7 I, Q }2 j" U4 N6 f) J1 g //释放空间 / B% k Q$ x1 W1 K9 M4 g free(FormulaNum); 1 }: ~- b' i5 k3 ?8 h! ] free(FormulaSym);' g; f9 m0 x% A8 {. I1 I return result; - r' x9 j2 u. I7 M Q! q) q1 k }! m6 T' t' ]& M1 ] // 计算算式结果 - O2 j0 C% h6 e double GetFormulaVal(int *Num,int *Sym,int count) 1 f% A4 z2 X0 }4 K h { ; G- `+ n, a* u2 S7 }' f; \* n int i,j; 0 H+ D% ?$ T: O8 t3 F" A double preresult;3 ~ U8 X; w" i# d4 Z' r/ w; h/ _) I preresult = Num[0];* K! G8 e* j8 \ i=1;j=0; $ x" O+ U: b7 F% @8 R2 W9 u! C2 F while(i% n4 b+ g3 ~, v: J( h0 | {+ S- W) x# D3 ]" @+ O switch(Sym[j])2 y% h7 P8 a6 `' M# q {- T* }! |+ ~% Q* M. y case 1:0 W# c- w P' Y( j( A/ L+ f preresult += Num; 5 _0 V" t0 h( [8 u: P0 N9 s break;; v0 N9 j% B1 N" @9 \ case 2:3 |6 H/ v+ V8 y preresult -= Num;( x/ j2 k6 I, d' P0 b5 [ break; I& n* I# E5 Q" {8 n case 3:8 ?7 }9 B0 X) \ I% ^ r3 @% B preresult *= Num; ; y2 W! J- ^8 ^+ ]* i* @- j break; 0 C2 P2 W5 o$ ], s7 v b case 4:: y4 i$ Z% S+ W if(Num == 0) return -1000; ! C) r1 M. C& Q$ i) _$ o ?: o( | preresult /= Num;" s. z$ H4 X+ S4 s, n' ^ break;3 ]* L/ L% t, Z/ M M2 |& \8 q6 u }* w4 g; @3 R0 t" g" z i++;j++; ) i3 F7 l8 m; a9 k% r } % x; M" k1 P" c2 D* H3 O5 v return preresult; //进行修正 ( A: B2 i9 I* g4 z }$ ?5 ?1 r3 j- s% e // 打印算式 ; U) Y1 g4 {# J0 g# [" w S2 ` void ShowFormula(int *Num,int *Sym,int count,int sum)8 G/ Q# `( U8 Z: k {0 K. d. i6 K0 k3 m % d( f/ z+ o4 O6 M( y. o0 t' M: S int i,j,len; & W; M) Q7 q& N# E! _7 n8 k# ` char *Formula = (char*)calloc(count*4,sizeof(char));% T9 v, ^/ F' A% L& z char temp[10];: Y8 E- n/ _9 ?7 c3 a itoa(Num[0],Formula,10); 9 b/ G2 J, K0 l; k, }: f i=1;j=0; ( I* x5 w- J6 `3 T while(i+ O* Q: _2 Q6 K, c+ d" u { 7 b+ e0 S# {1 q) f8 R. [4 h itoa(Num,temp,10);. r: v. u' `6 t4 w len = strlen(Formula);/ b! O7 X5 ?! Z- ~/ }( p$ R" S switch(Sym[j])% y: a; y0 z& T {* i! [# d' Y* H" Z4 v) n [' z case 1: , E4 T2 [/ J% O5 E case 2: 9 N+ S- ^7 l0 g/ i2 Q3 h/ E; F! Y Formula[len] = cSym[Sym[j]]; : v( j) W# B& Q0 a9 v( a+ G0 Y strcat(Formula,temp);3 A0 x, U: _2 V- H break;$ ? a! z) J |2 D case 3:5 K: E3 {9 D9 x" K case 4: D. F. A/ e. C! o2 e% k/ V ( w% x3 A6 h/ g; r5 q0 C // 如果上一个操作符号优先级低于当前的,应加上括号' q+ F/ |) b. `5 V1 q6 n if(j==0 || Sym[j-1] > 2) 4 `1 `' R+ @ f0 H- m& {* F1 S { * i0 |; q, E& |" i Formula[len] = cSym[Sym[j]];! {% ~5 o9 j/ ^ strcat(Formula,temp);% @8 w* x# a. i! J* h }* v U+ b1 s. a3 Z0 ]2 E- y else / Y7 [: S8 _: K. c' Y/ L {5 O4 v2 [& I8 l& ~ int n; ; w8 ?9 h1 ~0 o5 k, U i/ v char *FormulaTemp = (char*)calloc(len+1,sizeof(char));5 [; J; h" O9 d* \& S7 G for(n=0;n5 E5 G6 O3 x7 Q4 q5 a) ? {4 ?8 d) p3 s' l$ s- j- ` FormulaTemp[n] = Formula[n];" k# h2 F- n( ~ Formula[n] = 0;& K. N. s" P6 Z& C( T9 W/ _ } o4 P( U3 [+ N" p/ p! C) g. M Formula[0] = '(';0 v% }. b8 @3 N* \4 { strcat(Formula,FormulaTemp);8 V' E) A! A) q7 a( J8 h) F9 } free(FormulaTemp);$ K( a0 r6 v6 g, ~5 Z Formula[len+1] =')';& ~7 R/ s4 j9 k' n9 m, S1 R Formula[len+2] = cSym[Sym[j]];) m3 G0 E, {$ N; r: G0 K strcat(Formula,temp); ) s7 D1 I2 L( N8 e% y! t( Q }% f7 b" \4 @; y/ E; ~+ g break;$ V) V' D" \ X$ q, A/ V# o } / Y) s9 e0 w. Q$ ~% l2 `8 a i++;j++;2 R* @2 V! z1 n+ V; b: V/ T }3 J) A9 d! K8 i7 f; V2 X printf("%s",Formula); : S8 ?/ d6 k1 S. a: ~* G printf("=%d\n",sum); + n9 l3 u# \3 F( m" D) p free(Formula); ^% \9 _6 M1 z3 d6 m/ S1 [1 C }( N4 t9 K: c+ ^% E J( m7 O# ]6 A6 d; \+ K- @- N // 以当前数组为基础得到一个从小到大排列的数组! p7 P5 |/ p; U/ M% w* N // 返回非0表示穷举结束 # c" i' T! x- Q4 V2 H, G1 N int EnumArray(int *Num,int min,int max,int count), Q) D" r& ?+ c0 e% N9 C+ f [0 | { + y9 a+ v1 s( M" c int i,top;/ W9 V5 x) G" c9 s+ f5 ]. s top = count-1; 5 U% t! @8 J+ z/ y+ Y/ a Num[top]++;+ l- C% a: g: _$ `' B! } while(Num[top]>max-count+top+1 && top>=0) $ d' M+ S( C, K {8 S: `5 _% [# N5 o4 u& _ top--;4 Y3 Z9 e9 F7 C1 T- U& u Num[top]++;. K- k1 f: n b+ r# R }8 C5 ], D5 }8 R4 [$ q* y4 v9 E for(i=top+1;i8 a+ Y% c) v$ z& e7 r { + G9 U+ Q; Z6 m$ ? Num = Num[i-1]+1;& E. P% k1 R; T7 H1 T# [5 P }4 U3 P! N/ D# ?' S* Y if(Num[count-1] > max) return 1;+ w% x1 f9 w% n* Z B1 r9 x else return 0;, U- B. Z7 Y3 d; L } # \& I* t/ L; U# b9 y2 Q B# s & y! _5 @3 u7 n6 X& _2 b+ m) [7 } // 不允许重复的初始化数组 1 r& {6 P* M- j( b/ P void InitArray(int *Num,int min,int max,int count) 8 `- h( H# D' W" F: u {. i. N! w7 [0 C- \8 C! @( c8 L int i;3 y: W V- ]6 _$ i: _( q8 v for(i=0;i=min+i;' O4 w5 Q. j) r/ Z Num[count-1]--;9 A4 T ]- E9 v. H* R1 ?' q } , i+ N9 J7 j$ ]0 X; L: X$ b* ]& B3 J) z) {, A7 q* V 9 q$ s& a# K8 |; X) ?/ ]4 l, r( N4 @7 T! R 2 t U2 j3 I4 ?! R( g7 }
    [此贴子已经被作者于2004-5-2 14:50:47编辑过]
    " D! |9 U# Q2 l, j6 n6 V6 y0 m U" W, k printf("总计%d个式子\n",EnumFormula(1,10,4,24)); 的运行结果是: 0 Z- g+ y# U4 g/ E# d# J9 }3 N# F7 q1 F2 g1+4+9+10=24 0 k% \3 P* U E) N5 A: ^0 W I1+5+8+10=24 6 ?- H/ x i! i' W J5 S3 X. T3 c# {1+6+7+10=24 + j5 @" Q( p) J4 R, O- q& f) ?* H1+6+8+9=24 ! w& N( X2 S6 C3 ?( i# l" e2+3+9+10=242 Y, k( z! E ]; I 2+4+8+10=24 . A% q$ O& A/ A; J( l2+5+7+10=244 a$ V$ x8 r k, e" D 2+5+8+9=24 ; R4 N- y2 ?8 E& v) ]" E" a2+6+7+9=24. r6 O' w- G t' G0 {2 J 3+4+7+10=24+ I: j$ j2 p5 @) \ 3+4+8+9=245 T! i4 D: E; j! ]- J 3+5+6+10=24 ; t Q ^# f: D3+5+7+9=24" L: B( G: h1 d) _# C/ h0 T; [0 X! e 3+6+7+8=24 7 w/ y, t5 A r& X4+5+6+9=24 F2 E4 w& o# A* r& ~% m4+5+7+8=24$ F4 x* M* p( Z" C 这是什么意思?似乎是找出了 1 至 10 之间的和是24 的数据,这和完成计算24点,差很多吧?: [: R* G+ D6 n6 r3 ^( v _% u 比如用户输入 2 ,5,7,8 程序应该能得到计算这四个数据得到24的表达式才行啊,这样就可以写一个游戏了。 . s- a8 B' Y0 O: H/ _如: 1,5,7,8 有如下方法可以算出 248 n3 x; X z, \$ q: }$ f ((1+7)-5)*8 = 24 ' M8 I8 O( e' Y1 N1 ^((7+1)-5)*8 = 24 ! j" L/ u+ v( I5 L9 e(1+7)*(8-5) = 24 2 H* J" A6 @( W(7+1)*(8-5) = 24 " Y `! \. V+ z8 S& v5 u! ^5 J% t1 w6 z((1-5)+7)*8 = 24 $ @* g2 @% z( k9 w6 E* C((7-5)+1)*8 = 24 ) ]: U5 a0 f$ G6 F(8-5)*(1+7) = 24' a; w# N3 j" f% a (8-5)*(7+1) = 24# N# P/ I/ Z' y8 m/ q 8*(1+7-5) = 24 ( w' p0 e1 h9 c$ z7 |) L8*((1+7)-5) = 242 y% x n2 n( i$ K, _* M, s 8*(1+(7-5)) = 24 $ o& i9 R" T, G8*(7+1-5) = 24# \% q( F; g' I3 `% V& _9 c7 X 8*((7+1)-5) = 243 V8 J% E4 P9 u8 i, W( L8 p 8*(7+(1-5)) = 24 % l0 |$ [8 }6 f2 e2 o3 v" e( n, _8*(1-5+7) = 246 R1 v8 P7 F; Y2 {+ K 8*((1-5)+7) = 24 ' ^5 N B3 W/ R- v, y, z7 X: s8*(7-5+1) = 24& z7 ^+ J+ L/ j. G! J, x, s 8*((7-5)+1) = 24, n. r# |, z5 M' g# J

    该用户从未签到

    13
    发表于 2004-5-2 15:21:00 | 只看该作者
    结果是这样的:
    # E' C7 b+ k" [1+4+9+10=24
    0 d! O1 T2 U( P4 L, e) i' N1 `$ C1+5+8+10=240 t* g' b$ f6 l  S+ C7 `
    1+6+7+10=24
    ! Y& c( Z; U) ]7 ^- r; i( f! Y) V1+6+8+9=249 ^0 D5 M( D+ Y' Z$ r) p" _
    2+3+9+10=24
    6 @9 ?: E+ U# N7 T( w& k, M2+4+8+10=24
    : }8 Q# p7 ^* D. K* F3 ?/ S2+5+7+10=24# V) e' V( N- S+ I2 h+ C8 H
    2+5+8+9=24' n2 Z; D$ d$ L! G$ T/ t) J
    2+6+7+9=24
    9 ?* W# a: }- g* }: H; R3 Q( P5 O3+4+7+10=24
    ; i9 v" u" C; |8 ?! U3 j' {3+4+8+9=24
    ! m, L$ Z: g+ ?3+5+6+10=24) @0 X) K! o1 }: E* u& z8 R
    3+5+7+9=24! K( ?3 F9 @5 S2 ^
    3+6+7+8=24
    4 a; Z/ ]  A1 _* Z; ?4+5+6+9=24: T1 C- o7 w+ o) z2 F% U1 V" @
    4+5+7+8=24
    4 n; W& M" k; `& z' e1*5+9+10=24
      M- Z) \6 x8 ^0 m4 z1*6+8+10=242 }( G1 H" V7 L2 t: G2 ^3 M6 y/ G
    1*7+8+9=243 I/ ^% k+ z7 ]. i& d4 [
    2*3+8+10=24- q  W; E2 }2 B
    2*4+6+10=24* }/ C3 B9 T$ ~; G2 k" v
    2*4+7+9=24
    * ^4 K0 y* k4 w) ?8 c+ [, x2*5+6+8=24+ {  d: i0 q9 E4 m: D# H) E* ]& Z
    3*4+5+7=24  B2 P& ~  O0 ^( T' H0 e
    4*5-6+10=24) a& \) \8 Q; S1 i4 d; h
    (1+2)*5+9=24
    # z, }9 A: u0 W. F" ~( ]. X1 h& e  k# X(1+3)*4+8=24
    2 l. j  S3 c5 D# z1 Y0 b7 P6 b1*2*7+10=24
    ! ]* @0 d  d' S; u1*3*5+9=24& k/ x$ l) u8 ?) e" D  \
    6*7-8-10=242 @2 k* C) O, C
    (2+4)*5-6=24# N1 ~0 }) \3 `
    2*3*5-6=24
    + l6 i) P, @4 e6 J- t(1+2+3)*4=240 N6 C( g& ]+ Z$ g! t, L
    (1-2+4)*8=24" G' c# @! O: ~- ~9 M8 t
    (1-2+5)*6=24# v) }, f& u/ n% D4 q5 p
    (1-3+5)*8=24
    # Q1 Q2 v% R2 ^! P(1-4+6)*8=24
    ) q9 g! a- _: {7 H: @& l6 K3 P(1-5+7)*8=24
    4 _- D( ?" Y' D' G) Z+ K4 y7 H(2-3+4)*8=24
    & r6 n  E" o# N4 e( H' S- P/ S- a(2-3+5)*6=24
    5 b% X# s+ Z1 v( `. x(2-4+5)*8=24
    # G4 Z) @& |  a7 m) g+ {(2-5+6)*8=24
    , ]$ S, _5 B5 Y: i6 ]: n' J) j( R! g(2-6+7)*8=24! w# E* Z2 f" e0 r
    (3-4+5)*6=24
    % K. t) E$ y& r/ E" O3 `8 h. S' x" ^(4+5-6)*8=248 p* I) t% S. A7 |; I' V5 B* q; B
    (4+6-7)*8=248 T7 \6 P. s0 V9 v$ n7 R# J/ a
    (2*4-5)*8=24) G7 |/ g: \! u: k7 J
    (2*5-7)*8=241 e4 S2 d' j. b* R8 @- f) f4 H; U! j
    1*2*3*4=24$ {' t7 s! K; A1 T
    1/2*6*8=24
    % F& L# I* v2 l0 {% G  x1/3*8*9=24
    7 B$ O8 i" G& [# w1 R2/3*4*9=24
    3 J8 f: d' Q& L1 i2/4*6*8=24
    / H! o4 w* _0 a* I3 t4 n7 ~2/5*6*10=24% j, ^# ^  g0 f) h" I4 W
    2/6*8*9=24' o3 q2 [; O* b' B) F. ~1 T# i
    3*4/5*10=248 N4 P, g: l) Y0 J! o7 {
    5*6*8/10=240 L# |8 ]  {8 \- [1 y( b
    总计57个式子

    该用户从未签到

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

    [LV.1]初来乍到

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

    [LV.1]初来乍到

    16
    发表于 2004-5-2 15:28:00 | 只看该作者
    (2-1)*3*8 这个算式你就没有啊,这4个数字的组合都没有出现  j3 E3 }' y1 d+ \% X. Z+ a

    % {7 ]' ?) S0 p& k" [
    . T- d  r! K+ U  Y4 b5 ~
    5 O- Y9 E$ J8 L" Q$ `& ~
    6 M8 W# _3 T7 Q0 S5 C* D  l! s1 ~* P- x# X. u

    & O2 L, O$ B+ f: v3 c
    [此贴子已经被作者于2004-5-2 15:32:12编辑过]

    . V3 H2 z  w7 v' C6 o% ]$ P
  • 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 | 只看该作者
    - R7 f: }; F5 e+ O  S
    1 @8 p  b- t, h1 D2 O/ s
    用这个好了,只不过输入的时候要按从小到大
    : O, H; w+ ~# e5 B9 m' c5 d& A# `# `* o/ V) |4 o0 B6 k. D
    好象有BUG,我暂时不太清楚

    该用户从未签到

    20
    发表于 2004-5-2 15:38:00 | 只看该作者
    以下是引用yzhlinux在2004-5-2 15:28:15的发言:% S* f8 h6 |. s4 I9 S
    (2-1)*3*8 这个算式你就没有啊,这4个数字的组合都没有出现
    ( z2 D; c) Y1 s1 |' N# h& q( S
    " \! D' N5 P) [4 s
    本来为了防止诸如
    6 x3 _: }3 |& e4 Y& i1*2*3*41 |8 i% ]" q. v- d# O( B( {2 q
    1*3*4*2
    ; y, @2 y/ [2 z. u- C: h2*3*4*1% Q7 [* l& H, q3 n/ G- b, `% P
    等的重复,只使用了从小到大的数组,不过这样好象也丢了不少可行的式子
    ) V% q5 \, ~$ i0 S5 @# S
    1 ?9 u, e/ }; A# h+ A8 w另外你的程序就是有这些重复的
    ) i" g8 l6 T: T' G
    + S+ j/ t3 Q5 y1 b5 _  ^) Q# |9 [PS:VB的程序感觉就是慢好多啊8 V( L+ p' M+ d0 F6 y& M7 b
    [此贴子已经被作者于2004-5-2 15:42:01编辑过]

    6 [! F# @& {7 P6 P+ b2 T

    本版积分规则

    关闭

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

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