下沙论坛

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

QQ登录

QQ登录

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

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

[复制链接]

该用户从未签到

跳转到指定楼层
1
发表于 2004-4-27 17:53:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
就是扑克里的24点游戏,4个数,+-*/得24……* b! h  T% V& Y2 y
* p+ P2 F7 R3 c) m) E! i8 o
偶还在想……
分享到:  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的发言:3 z1 Z9 N, h5 W+ h1 _- Z, X
    穷举法吧
    / Q$ R  _1 c  i% |4 M0 m
    那你的代码要写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 ^* y. Z. r) z$ [
    function GetMach(A,B,C,D) as String       '得到一个字符串组合如:(A+B*D)-C. X% X. F- G  X( L0 n( L! S. h6 ^
    function GetValue(MachString) as Float    '得到字符串的计算值 ,可能是小数, u; f2 a& q# x/ v" S
    那么程序就好写了:; I& p, B5 W8 o) r7 l
    GetNumber(&A,&B,&C,&D) ;    '得到ABCD则四个数字,赋给A,B,C,D四个变量' [) j, W# a, m. H4 c" C2 C
    do{
    9 L5 o# C% ~: m  MachString = GetMach(A,B,C,D); '得到一个表达试的字符传
    6 M; L/ C3 A8 O1 w) e" A8 N  if(GetValue(MachString)==24) break;$ e- N4 D  w5 e9 K% q3 d2 r2 Y$ T
    }
      g+ z* Y; n0 J" m  m& Hprint XXXXXX;( ]6 J% n9 k) {& t  P0 m' |

    该用户从未签到

    7
    发表于 2004-5-2 11:57:00 | 只看该作者
    我现在试着在写,就是不知道有什么好办法解决重复的算式问题,比如
    7 i" P. r8 h3 _$ e* U, x' Y(5-2)*8*1
      o3 R2 W; h( J* y) V$ Y) H; v2 D* X- s* ^! `; a/ p6 v; r5 z
    (5-2)*1*8
    5 Y4 {; Z- n9 N7 o7 r  F5 X0 W8*(5-2)*1
    * |6 l7 |6 Z* ]0 r8 }/ f等等
  • TA的每日心情
    奋斗
    2015-9-17 00:58
  • 签到天数: 1 天

    [LV.1]初来乍到

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

    8 J0 @  c) `8 W- n; }2 z, Z5 m  V2 g  r4 n2 X; H" C7 b
    花了一个上午,终于完成了/ Z* R  ]* |7 e% _; Z  ~2 v
    你参考参考吧,哈哈- y3 I- b5 n! N% I- R' E

    4 d- ]! ^, V5 |; C$ D& Q( h; z, F" r' X* e5 U
    [此贴子已经被作者于2004-5-2 13:43:13编辑过]

    & B& \8 Q% b4 x5 U7 V! k. I
  • TA的每日心情
    奋斗
    2015-9-17 00:58
  • 签到天数: 1 天

    [LV.1]初来乍到

    9
    发表于 2004-5-2 13:42:00 | 只看该作者
    上面的发现有一点bug,) Q2 A7 h2 g4 y
    这个改过了+ @! k/ `) d4 [' X* V, r3 k" p
    一个计算 24 点的小游戏# o; p& ^/ b9 K- H
    VB 编写' F% r, h3 b( k/ Q7 s

    7 N# y! k  }5 B3 r6 V# M1 C1 ^$ `  \3 M, z  N2 F5 @5 D$ _# N
    [此贴子已经被作者于2004-5-2 15:17:46编辑过]
    1 t+ V8 {) e# Z3 f

    该用户从未签到

    10
    发表于 2004-5-2 14:41:00 | 只看该作者
    #include , M0 n, o7 O% q9 R! V#include $ t6 t- v& \. r % f9 v$ c! m4 G2 I int EnumFormula(int min,int max,int num,int sum);) \! f) ]0 f& f* i; M8 Y void ShowFormula(int *Num,int *Sym,int count,int sum); 0 d/ A+ T9 u/ ~- H2 h8 h) x6 K4 y' ydouble GetFormulaVal(int *Num,int *Sym,int count);& k+ P7 i. m2 z+ W6 L! c int EnumArray(int *Num,int min,int max,int count);' u0 P! P o5 v. C, Z! i5 ~$ y( E void InitArray(int *Num,int min,int max,int count);$ T; S% r, b! l* R% W5 [ const char cSym[5] = {0,'+','-','*','/'}; ; W5 r; c( E' @! ]' U N / Y- a, K& [7 j4 A3 Eint main(int argc, char *argv[])' d' m5 p# p, I8 f/ f {1 x* ]8 v+ v2 M! }/ L2 [) k printf("总计%d个式子\n",EnumFormula(1,10,4,24));' y* K$ }8 H; p8 S system("PAUSE"); ; q# T' X& k* I% h& w* h. W return 0;$ Q- V* A, w4 @9 y @* E6 n }2 [2 p9 a0 B; a5 i % y1 z2 p8 K6 B. B3 v8 A int EnumFormula(int min,int max,int num,int sum)- V0 k8 @; z, Y7 j* I {9 p) Q2 X+ h1 x int *FormulaNum = (int*)calloc(num,sizeof(int)); //储存操作数 5 g& \4 L) V3 G. y& k //储存操作符号 / L" `) r8 G8 e% ?4 F, X) n //最后一位用于穷举结束标记 ! q, ]& a. q$ _+ S) V$ D/ G. I // 1 - 4 代表 '+' '-' '*' '/'5 H! y2 p) W( n) j! w int *FormulaSym = (int*)calloc(num,sizeof(int));' D7 Q% k g5 I: x2 X8 z 5 _' p0 E! A% M8 a6 e" g0 s+ \ int result = 0;- v/ K0 b: e! h% o/ r; K // 初始化操作数和操作符号数组 , \1 ?4 \" r( h2 U. Z3 O 2 d3 r. j; ^2 T6 f int i;. {# U2 ^$ H/ t$ e2 s% f+ Z 3 B) e) C6 k; |5 e3 b; d5 O6 b for(i=0;i = min;, e; A$ t4 f3 j+ s0 A for(i=0;i = 1;2 z T. D/ `$ `. f FormulaNum[0]--;3 o6 M4 I9 Q9 G* h1 Z# C ' A1 g& [" N7 T( { InitArray(FormulaNum,min,max,num);4 ?% l2 h& @( p8 s FormulaNum[num-1]++;. I; Z& k* {5 y8 p% x/ {; x. \: H' j, N // 穷举操作数和操作符号组合. Y, I1 L. s2 X# Y, l while(FormulaSym[num-1] == 1) % z5 H9 l6 \2 _0 m$ l5 { { $ r5 D. |3 u# w% F double t = GetFormulaVal(FormulaNum,FormulaSym,num) - sum;1 S. W! i' l+ A0 Q6 ^: s) D if(t>-0.01 && t<0.01)5 S5 [' I0 c4 j4 \ { 4 u% i; }- u9 Z; e$ g& C //printf("%d %d %d %d | %d %d %d ",FormulaNum[0],FormulaNum[1], ' w$ V0 _ H0 s/ Q: A //FormulaNum[2],FormulaNum[3], / E7 A- b, F" g, ^! U: U // FormulaSym[0],FormulaSym[1], 6 C2 i$ e- s9 D // FormulaSym[2],FormulaSym[3]);" j* `( Z) d* _6 L! K' U8 O ShowFormula(FormulaNum,FormulaSym,num,sum);# s& ~) @6 `2 }! S) s4 j result++;, J1 Q% |6 b Q1 l } : l% X- Y a; \" v/ f" B 6 R( y% h1 q& r. m/ F // 依次穷举操作数) p' H; {3 M# c" ~ 4 J! S* d3 y1 M4 x/ C1 U' ~ //允许数字重复的穷举& c9 A7 g+ x/ v* O3 v1 f7 k //FormulaNum[0]++;% X4 @! }4 N% r! J5 g5 { //for(i=0;FormulaNum > max && i ) W$ H8 Q: H- G/ E, I- ^0 K //{3 E9 j* |) W& H) W$ B* }. ] // FormulaNum = min; : K7 F# j- H6 M$ B7 z // FormulaNum[i+1]++;$ {: L8 s/ M u //} 6 j% N7 B; d+ J' c& H" H4 l% P // 操作数穷举与操作符号穷举联接; ~6 E/ {# H4 l- a) S' B% O0 ] //if(FormulaNum[num-1] > max)) a' C( Z7 ]- V- p //{ % X0 o* L7 O# U2 i" o3 E) b // FormulaNum[num-1] = min;& p5 ]2 A8 Q! `# |% j // FormulaSym[0]++;1 J$ ^$ S$ D6 L' |9 q- W2 q1 m //}1 H0 X$ c5 k" m% I Z Z$ @* Q . b! [+ m1 Y2 Q* e( j2 V // 不允许数字重复的穷举 ; d9 Q8 T% k1 S) Q" E* c8 x // 数字必须从小到大的排列,防止重复 9 B* a& s1 [$ `* D2 a5 T if((max - min)< num) exit(0); // 出错 " X8 \8 r% ^# k3 o& X# o" P: N: E {9 X' Z( A: Y# N if(EnumArray(FormulaNum,min,max,num))% f0 o0 m( p- N+ u {1 k% W, k, Y4 }: q7 J1 C FormulaSym[0]++;4 i# A0 W9 c* w InitArray(FormulaNum,min,max,num);: @: a, ^# A3 E |2 P5 C4 K2 r D FormulaNum[num-1]++; 8 u+ o4 ]$ ]7 I9 z' ~ } E- X! I4 d2 y& ~. L 2 q% t. D U1 o# \( `, `/ o // 操作符号穷举 : {8 p8 O- u/ Z+ @ for(i=0;FormulaSym > 4 && i) O/ V( I n* v. L8 x0 Q, O F& O { % ?0 o, H2 L: F8 J2 }3 e, o FormulaSym = 1;0 B* U7 Q& N0 e; [6 b, K FormulaSym[i+1]++; 7 y7 S! s7 `3 H$ T" C% ^ } + ~/ s) N% s% |6 C* N; }# H0 B3 z* ] } * d" {& `- K5 P# `" y. E //释放空间 / H9 i# K5 R2 g- q free(FormulaNum); 5 x0 q# g+ e+ l$ G free(FormulaSym); |) k7 l1 T: k/ S( g7 J& t( j return result; - C7 Q. L8 [& H$ E2 |& s} 6 k# N8 \8 D$ L( C// 计算算式结果 + G8 n2 B+ x: `# g+ Adouble GetFormulaVal(int *Num,int *Sym,int count)- {8 Y9 e8 W' D* k- E2 a { $ l8 G- P* V6 |+ o) p. a1 L int i,j; ! _# N' N/ k: C( t# ^ double preresult;: Z: O+ K3 k# h5 d9 ?: {% f: }( a8 O preresult = Num[0];- j2 A1 R% v8 c: l4 {* D i=1;j=0;+ T6 [0 B, J7 x. m# g while(i+ U$ B) _8 R ` {% n1 s3 b8 D2 p0 Q2 _ X0 A switch(Sym[j]) 5 G) U8 x+ L3 K* @' J0 [" y* i" q { ; M+ z1 j1 X" V! e I- n% O2 o( f case 1: ' p7 J9 m1 \: } preresult += Num; 8 L; x0 U( l/ Y- D" b+ d) o break; * H- T, }( j: ^/ n1 w' M case 2:5 N4 f, b7 e8 \& ^8 H0 d preresult -= Num;! e6 B3 g! K0 P/ Q3 H( T break;& d' g4 H- `! H/ O' u; { case 3: + K! b H6 u! I preresult *= Num; - o/ R3 }: Y. N* V) [/ S4 H break; 7 l4 r- p+ ~7 E( o2 k7 k# C! o- X0 a$ D case 4: " b S7 k4 n* R, B if(Num == 0) return -1000; / u8 \. P' d$ C4 Q/ a: |6 { preresult /= Num; 9 a$ u1 @. [5 j" U! p; h break;; z) e! n6 ^( J/ O c& L0 L } : Z% @# M5 S0 w, V! W i++;j++; ' R* u4 ~& a5 l E. ?0 N, S } 7 A% b3 }1 s7 w$ ?" D+ V% i! W( U return preresult; //进行修正 ; w S. s0 [" e# Q/ D, g}5 Y5 ], [: U9 R) P: E" r // 打印算式 - T" \: u- C9 H& I7 W: z Fvoid ShowFormula(int *Num,int *Sym,int count,int sum) / u5 R( H8 g8 G8 c; V% c{2 ?9 a3 |, |8 G- d$ S 8 n5 h, H0 F; |. z int i,j,len; " r8 W3 P* l" U! w& c char *Formula = (char*)calloc(count*4,sizeof(char)); 1 L3 P- y$ ?1 O6 x6 T7 Z char temp[10];9 r# m6 |1 c6 e, L4 O itoa(Num[0],Formula,10); t0 ]. O3 O: u- w; b( R2 m. Y" s" R i=1;j=0;1 n3 Q$ Y- {0 N a while(i Q$ _. [4 k5 `, X" V" Q& o { 2 t( J5 D& F3 c3 g3 J8 g' l itoa(Num,temp,10); o S# W5 ^+ ]6 P9 Z) } len = strlen(Formula);6 z: J5 J2 X* I switch(Sym[j]), l7 ~7 U* H" [$ z# k2 M { 1 C) B, N4 H& G$ g' A case 1:( }+ |3 C" t$ N7 q. l- e case 2:% a% B0 @$ J7 ]' O, o Formula[len] = cSym[Sym[j]]; - U; X0 L2 m$ d: w# Q! C4 V8 p strcat(Formula,temp);6 E6 I5 N& r: @* l: J9 c! `! l break; 9 A6 d" s$ Z @7 c case 3:1 v' t6 _, e. r0 |% o1 G case 4: y3 k$ p4 \4 B. c. Y) ^1 H0 p % U. f, p; C( y! ^ N( @6 r3 v // 如果上一个操作符号优先级低于当前的,应加上括号7 V7 s3 ]2 l) ?$ r if(j==0 || Sym[j-1] > 2) s; X' {9 |( J @) A { - V( D. X5 b3 M8 d0 ?7 j8 U7 r Formula[len] = cSym[Sym[j]];$ Z+ M& I2 ~3 [ strcat(Formula,temp); A; ^% y1 X6 j4 D2 R }0 t6 v; z8 K5 h) \ else+ c2 a* @# M$ l7 G8 h { 0 k3 j& b! }/ Y! K r& T, A# W int n; # t( _ e* A! @$ A. z: T" T$ t! J; } char *FormulaTemp = (char*)calloc(len+1,sizeof(char));# u: U& @+ c& ?1 A( C for(n=0;n1 T4 ]* v' Y1 l: Q9 s2 | l! h! _ { , k3 b$ i6 b! ?! }) g4 b FormulaTemp[n] = Formula[n];+ K1 P$ U: A+ e/ _$ \ Formula[n] = 0;2 g/ V8 Z9 ^" P9 d) J& ^4 S. P } - \" F v. q3 x! B, a3 ` Formula[0] = '('; / O4 X% S. c5 [2 f1 ^ strcat(Formula,FormulaTemp);/ n0 U7 G9 k1 m+ z free(FormulaTemp);5 F3 h& g3 e2 \& A7 s Formula[len+1] =')';$ ~2 A/ X' q( {$ J5 A Formula[len+2] = cSym[Sym[j]]; . y+ v/ l# W" r% d strcat(Formula,temp);% p, S. L5 Y& f' r }/ c9 l4 D7 d' y6 s2 T0 H. Y; o3 o break; A5 l0 T) U; _) G }9 d# l( X+ o, r+ y i++;j++; ) e- W' W; r; q5 J" {3 _$ I7 O7 x }# l5 @: @, J; G+ q8 t. I- P printf("%s",Formula);6 d5 } |! I& m, T$ a+ T i: N printf("=%d\n",sum); 6 B5 Q! D" t5 v) l7 H& [8 d: q, ^" z free(Formula); 5 o# W4 j: x5 D! S+ |* E! A4 z% S} 9 a" A' A, N- J / p8 @9 }( l- p// 以当前数组为基础得到一个从小到大排列的数组 ( d7 b4 q2 h9 D+ y# ], R// 返回非0表示穷举结束 ; n! ?2 V9 K2 m0 a" f! eint EnumArray(int *Num,int min,int max,int count)2 g8 V; ^! w" E2 \# S {& c8 [# s) g' }% k5 k' p+ r$ I int i,top;- D. @# f/ G8 ?' ~ w top = count-1;- O% i4 q$ ?8 S) O Num[top]++; 3 Q' i& f4 p0 w- Q/ @# Z while(Num[top]>max-count+top+1 && top>=0)7 ? m, h y9 ~! R8 ? {3 s: Z+ O* }3 n top--;* O$ q2 s) i; f- r' L+ @# q% C6 _3 d Num[top]++; . F2 ^' ?* O c) m1 T" u4 p. Y } # \4 w a, E: i" r6 P for(i=top+1;i! n K. V4 K) _. i { & Z3 N( ` f4 U: @, c+ T Num = Num[i-1]+1; 7 F3 b4 Y$ R0 h: k% r; r } ( W% c% P0 E* \8 n# P if(Num[count-1] > max) return 1; ; A3 o5 V2 |# W% r3 O( N else return 0;7 R3 j) Q( ~4 H# [4 T$ |/ v! m } 6 B M6 M; N' y8 t! Z0 x k& J$ W3 B) M: V' M3 Q" u9 F // 不允许重复的初始化数组9 u# k4 G P9 i void InitArray(int *Num,int min,int max,int count); ^* F7 y' x: q0 d* ^ { ( l0 v3 h0 K6 Z V h" p- _ int i;$ C) k) B; v0 }- Z for(i=0;i=min+i; - q; }) c$ Y9 {9 E$ s( `' u) z* T Num[count-1]--;1 u. b& J8 L9 I8 K s7 _ } e6 V( _. h% o! z: ? . ^ l0 }; i" F& { ) B. I1 D* g; g6 s1 ^. Z; T! [- n+ j ' S- i2 M# c( z8 I6 } N
    [此贴子已经被作者于2004-5-2 14:50:47编辑过]
    ; t: f' m% B/ h1 x$ s( [! R

    该用户从未签到

    11
    发表于 2004-5-2 14:54:00 | 只看该作者
    本法穷举出所有用min - max之间的num个数组成算式,结果为sum的情况
    9 I1 @6 [+ N1 t
    . \) ^0 \( ^0 {7 t! l如要具体的话,可以不穷举操作数,直接输入操作数,进行操作符号穷举
  • TA的每日心情
    奋斗
    2015-9-17 00:58
  • 签到天数: 1 天

    [LV.1]初来乍到

    12
    发表于 2004-5-2 15:17:00 | 只看该作者
    以下是引用游侠无极限在2004-5-2 14:41:26的发言: % a, g8 R! v6 Q+ ?* j3 B#include $ S9 f! A( U- J4 z: d) g. X1 c #include / A) {6 ~5 K* [. ~ \ , ?1 N1 j6 F/ F$ [5 f/ q, d# F. N int EnumFormula(int min,int max,int num,int sum);) F9 ~1 a% {# q5 C void ShowFormula(int *Num,int *Sym,int count,int sum); Z8 e/ d, a) N% |5 J! T double GetFormulaVal(int *Num,int *Sym,int count); + U2 }. j1 r/ O) H* t: i% l int EnumArray(int *Num,int min,int max,int count); 7 r% u& H, X7 p! X; _/ _& q void InitArray(int *Num,int min,int max,int count); 1 e F. P/ Z( K- w, A const char cSym[5] = {0,'+','-','*','/'}; 5 E1 ~. x* P. S# O; ~( f& V7 z' b/ ~: M# c F8 z# ]$ t int main(int argc, char *argv[]) . l5 c$ k1 Q# J {8 A+ ^ r8 d, G3 s @" d printf("总计%d个式子\n",EnumFormula(1,10,4,24)); $ L9 U& X( T& V system("AUSE"); ; c0 t" r8 _4 U3 r! V1 ?; J return 0; ( {. @5 e$ H" ~% W } # E3 Q0 A7 t# x1 w' _6 e0 }& q , T: _' U1 ~9 y) F. f/ Y* a int EnumFormula(int min,int max,int num,int sum); X0 ^" l$ J6 a1 d2 _; q: L {/ F6 c; M4 K w% v* ^ int *FormulaNum = (int*)calloc(num,sizeof(int)); //储存操作数 ; }7 i- }( @( Q, }0 B4 Q' Z //储存操作符号 7 O$ o7 z6 \4 q4 {8 V( g //最后一位用于穷举结束标记* P' ?/ M( k$ q8 ^% A/ ^ // 1 - 4 代表 '+' '-' '*' '/'/ v9 s0 B' |4 _) F0 g( n& w. w int *FormulaSym = (int*)calloc(num,sizeof(int)); 5 Q2 T' v0 ~$ y & D% q3 O, a( Q* |+ o0 w- y int result = 0;/ y B5 P2 }/ n7 U // 初始化操作数和操作符号数组 " \/ h* [ l6 B5 {- c4 J, c) M s! n* Q% E. e3 c- S* h+ q int i; m6 W3 ]' ]5 c$ U6 V4 Y$ R / B- G0 |' J* d for(i=0;i = min; , s2 e" a4 N1 [$ E+ V2 C) A8 V for(i=0;i = 1; 2 \$ Z( v- ^; g4 K" S! N FormulaNum[0]--; 2 [$ \$ h! J& Q7 U7 ^2 O ( A+ Z: y; J* [ InitArray(FormulaNum,min,max,num); 7 z: V: g7 }! J8 \& ^" b6 B FormulaNum[num-1]++; * L+ e- [' a V, t // 穷举操作数和操作符号组合1 k% ]1 S8 {0 G- f, S! s while(FormulaSym[num-1] == 1) % ]3 C; j9 F" L. s4 B {5 G5 q" d4 s1 [3 X* p' [3 v double t = GetFormulaVal(FormulaNum,FormulaSym,num) - sum;+ M+ b* C7 h1 u- Y Q" y0 g if(t>-0.01 && t<0.01) / l/ J7 p" k! O( ] {! W4 p: V% J( z& z- P0 V3 i //printf("%d %d %d %d | %d %d %d ",FormulaNum[0],FormulaNum[1],, j" @2 r% x9 ?! s8 ^+ |- q* } //FormulaNum[2],FormulaNum[3]," j: {9 \' Y8 o5 D // FormulaSym[0],FormulaSym[1],$ w; V/ y3 Y8 [+ K // FormulaSym[2],FormulaSym[3]); 6 @3 r9 u& S) O* I ShowFormula(FormulaNum,FormulaSym,num,sum); / D8 u6 z; f6 g5 ]# \ result++; $ f% u/ u+ U4 g q2 s- O$ w4 c } ' p2 x# U4 m: A. F4 X: Q " E0 Q1 J/ P: q3 q- o, y // 依次穷举操作数- A( N) N9 J) { 4 A% u, j, d- c" j //允许数字重复的穷举 9 P B6 ^9 f7 b) R0 E( h //FormulaNum[0]++;2 K" i! u4 Z; \. ~0 Q M1 X //for(i=0;FormulaNum > max && i 7 |' @% @" ]; a0 A$ g# J/ | //{ - ~' a+ R% [' y- f/ y; E' A // FormulaNum = min;8 s; V7 K! a8 ^8 Z2 ~ // FormulaNum[i+1]++; ' n+ H( ~2 v, h) l( Y //} 6 ^8 P# G5 f7 C7 I // 操作数穷举与操作符号穷举联接 5 ]. X+ L) r; ?" ~( K //if(FormulaNum[num-1] > max)0 ~8 y6 q. E: n: a/ f //{/ R) w1 c% n2 V0 |. L& V6 J$ l // FormulaNum[num-1] = min;2 C% _$ O) d( y8 |# X& }* ~ // FormulaSym[0]++;+ X8 D6 t) p4 h //}2 x" ?6 Y; p* X, j. p/ M & n: l1 k7 u: x4 K: A+ q% N // 不允许数字重复的穷举' v$ e+ |5 z* e6 A! [. d* v+ O+ g // 数字必须从小到大的排列,防止重复; u: U6 o) l5 p5 ~9 J6 Q if((max - min)< num) exit(0); // 出错$ r' f% t2 y4 t# E# {$ ` 0 V. _; j2 ^" Y. k if(EnumArray(FormulaNum,min,max,num))- m; O9 r# R( a- H# F. T8 B { " _8 t) |. z! Q5 M) d FormulaSym[0]++; / o( J2 D7 o/ f/ n! W8 F InitArray(FormulaNum,min,max,num);) J; R) q9 J) O' N5 O; C% C FormulaNum[num-1]++; 2 i0 G# q4 G3 ^1 m }9 j; P- Z Y/ {+ Q : ?6 ?% X s1 L- s F+ l) z // 操作符号穷举" l9 l- x7 ^/ @ for(i=0;FormulaSym > 4 && i" L- p: t! T- W( } { 5 Q! B9 n8 w0 |# N L FormulaSym = 1; 7 G% p/ t" A4 o, w6 `* T FormulaSym[i+1]++;6 f& }# z: y% ~" {4 [# U# R" |( ? }3 l" v2 C ^9 R' c' S' A 1 q8 a0 @! U4 Z! U8 L ^' Z" R } Y& T2 }; O$ m //释放空间 . V6 ]1 j: x; Y+ y9 J5 ]: o free(FormulaNum); ! W" R& f& Q1 A/ Y free(FormulaSym);" `- U5 p7 t- @1 |+ q- s return result; $ t' J$ t: t4 w) U4 F }) V3 ~7 ~! Y0 \ // 计算算式结果7 d/ c h! G( A+ {, ` double GetFormulaVal(int *Num,int *Sym,int count). e7 q, g/ g3 t; r6 D/ M {" R/ [9 i! Z# X# m int i,j; 4 _. Q4 [- O9 `' m double preresult;3 B! {- o/ C/ \4 ` T: c Z- w preresult = Num[0];7 w' U0 `2 `) I* d3 i% i i=1;j=0;) n8 q% l6 C( v! K# I while(i- |4 w3 O6 U; \, x* T- \ {; r+ R* t) E6 X9 ^ switch(Sym[j]) $ D; `( ]$ U1 W) U# @ { , G. F8 J9 g( d% b' G case 1:4 O" e5 G/ p4 q5 ]- N" S/ y8 B+ o preresult += Num; & h! v; i* e% ]) O. M break; 3 N" g4 a9 e# j: L8 p8 X case 2:& R* ?7 N. _: C4 {) f, F( Y preresult -= Num;1 Y7 q& x2 L) F! J+ W/ F# C break; 2 l) R8 A8 p: U7 T8 W) ^ case 3:! F1 ?# m: I; P$ ~8 ^ preresult *= Num; 2 m/ ~* g1 \0 a9 m6 Y4 D+ E break;+ u9 _% L6 A0 A case 4:4 v! t" Z" e6 n" l- E0 B( D. O( Y if(Num == 0) return -1000;5 {/ C9 T) g8 H7 E+ g8 P8 U- G/ e preresult /= Num; X+ T3 B& t3 F% D/ W D. w5 [& w: I* [ break; I! @$ y$ s% v6 `; s' T3 i }+ | }# T% g: T+ K& q2 V/ Y i++;j++; ( i8 t8 F" m4 p$ n$ H }# \* z! ^' f2 Q* j8 n9 V* M9 d' W u return preresult; //进行修正5 T5 x9 \) i8 X0 K } 4 @2 ~8 t# n+ f6 J; e // 打印算式 : a) e: P9 j% A. G+ p+ S, c j void ShowFormula(int *Num,int *Sym,int count,int sum)" f8 Q8 _4 @- V6 ~# {3 K& j$ J( N {, ~2 C% O- ~4 p* O9 y u ( T* Z& L3 n0 a int i,j,len; 0 _) q* }8 b& H! ?/ y" p; A char *Formula = (char*)calloc(count*4,sizeof(char)); 5 O% X6 ^2 w! ^2 P9 T) g; W char temp[10];* U$ m/ M. Y( R. [ itoa(Num[0],Formula,10);" H/ C9 F* H J, F0 B7 C0 m- |6 | i=1;j=0; ( J, R. Z3 B4 C/ X4 d6 ^0 b3 i1 W while(i5 l0 m* R8 q8 f1 o { & L% }2 x* P V* i/ n4 H itoa(Num,temp,10); / z# F8 _) d/ A1 o, z" O len = strlen(Formula);& U, b* E; i! O9 K switch(Sym[j]) ( u$ X3 L9 t3 X* {' [2 Y { / ?4 J8 j2 M6 m) v) q/ i case 1: : X. z5 r2 w, ~( { case 2:0 M P4 Z% c* s7 v Formula[len] = cSym[Sym[j]]; 4 j4 E$ E' L9 K& s strcat(Formula,temp); $ c' S* l6 I$ i, H: t7 s3 o break; , j. p( N5 U, x case 3: - F! c; | Y8 E7 T2 _ case 4:- k* L/ B; S1 w. C+ | + K7 k( v6 C: [1 T/ }; B! Q g7 x // 如果上一个操作符号优先级低于当前的,应加上括号& }+ }, D. q8 U L if(j==0 || Sym[j-1] > 2) , b6 e. h, K) z* B5 R {0 P, h4 Q0 g; c# P' g5 I, ]% h6 V Formula[len] = cSym[Sym[j]]; 5 g% n1 d4 L6 @' e! |5 ~- [/ x. X( j strcat(Formula,temp); - C) G" l- }6 |7 G& [$ N4 s7 | } 6 w3 f) q1 r ^) s1 Q else * n, w; b8 q# j# U2 x" B {% K; S" t j3 T2 k1 i int n; 0 p6 z7 X8 m' N% W char *FormulaTemp = (char*)calloc(len+1,sizeof(char));7 n! e- l9 |8 v* O for(n=0;n1 T' v0 H- |, r! ]2 U' m' A {; r& W ]6 q: I* s( | FormulaTemp[n] = Formula[n];; X$ F# c' b' ~, w Formula[n] = 0; - x' [+ S8 d7 b& V$ d3 [# }) `. n } " T. v9 P1 O Z Formula[0] = '('; 6 ?; i3 e. T) |/ T strcat(Formula,FormulaTemp); 5 |0 x# m" Q: v) Q- ] free(FormulaTemp);! A. l9 `: x( ^7 p2 U Formula[len+1] =')';. F3 Y7 F: z' K7 {+ e7 l Formula[len+2] = cSym[Sym[j]];; t" J2 s" @* F r+ d/ E strcat(Formula,temp);4 Y, |( Z5 w/ v, j4 h8 X }+ W1 c m' z5 a4 V, O2 H break; 2 D( G1 q. U- }2 J } * o& }- [9 C/ R8 ]7 b% Q! g- Q0 T i++;j++; W* ?) E6 e5 c2 b: s0 A1 s/ C } $ p' N3 s& S: k, F. w+ f6 R9 L printf("%s",Formula);" A" a0 J w: ` K6 R printf("=%d\n",sum);/ |7 J8 T' M# E7 R. g( Y free(Formula); 9 J3 j, Q. X' O& w- Y- N! O }: D2 I( k- m+ [ " g0 J$ t" b5 i5 n. y4 m" f // 以当前数组为基础得到一个从小到大排列的数组 ! v% o2 j( c2 D0 P$ v; C // 返回非0表示穷举结束- Z1 n) w4 ^$ y- A& P, Y: e int EnumArray(int *Num,int min,int max,int count) * Q. E9 c3 F% f5 [/ ?6 A) e. g {( J9 [& B# h: G b$ F w% e int i,top; 8 P; t' ~% ^0 I$ G. @9 W/ K top = count-1; : h4 [: ~0 o6 c* `$ A* P Num[top]++; " [7 R1 e! I* `: l4 u# p3 j3 P5 @ while(Num[top]>max-count+top+1 && top>=0) o \ n9 ^9 I. k. g' D( r {- c# D, B4 W# j$ z top--; * Z- D/ W- a M) R Num[top]++; + n: P8 I- j$ V5 d% V) ]/ ~5 b }/ y4 X b& c! V/ ] ~" a t" G for(i=top+1;i$ ^) X+ w1 M9 |, j% F3 ?( W {% h; K/ @ c! J! a# b" U Num = Num[i-1]+1; g* t+ E! @* m2 t% l3 Z; N3 s: e } 4 r9 d2 E, ~* @, r- k+ u* V: m if(Num[count-1] > max) return 1; 3 a: f3 J: H9 s: d% R% C& Y else return 0; 5 T( o0 F& W3 T2 \+ V. r) @ }1 f! q' t7 p. o9 S$ r9 o2 i+ i ! Y1 v2 O8 |6 t g ~: m, s // 不允许重复的初始化数组 - e& Z6 o- }8 G4 I E; v9 P, v void InitArray(int *Num,int min,int max,int count) : Z Z+ s" P, ^% N2 }& r {" ~' @; A$ p( G, M) x7 Q% ~" s {4 E int i; 5 F- @# s: [5 ]0 a# W. w. s for(i=0;i=min+i;3 V& m1 a7 W* k6 \6 B4 { Num[count-1]--; 0 ?4 r" w4 q$ l I$ a' T } " j: i2 p5 M& A8 s+ E( M. C0 K' s k. F" A+ C 4 D9 R+ U# E& |* B [0 j. b H3 _ W 1 A' x: h% w, y% T/ b 2 A3 w! y; [. _" ^2 H( e. v
    [此贴子已经被作者于2004-5-2 14:50:47编辑过]
    ( `' d/ q/ G, \/ Z9 N ! e. m3 n: h0 m3 {' T printf("总计%d个式子\n",EnumFormula(1,10,4,24)); 的运行结果是:, \3 o0 g7 ]) ~. @$ c8 N 1+4+9+10=247 [/ L& C( V8 M! D6 @ 1+5+8+10=240 a# }+ f% M8 B: f6 b- ~4 g7 _ 1+6+7+10=245 k* U, j$ Q A% g# ~. D: |3 { 1+6+8+9=24# s" U+ A& M4 @( a, E. }, R 2+3+9+10=24 - W) j, e) g& h6 K& y: ^$ g2+4+8+10=24- E. P/ f" ]# o% P' r( [ 2+5+7+10=24 " R; T0 E* T4 @$ `+ H0 k+ c/ y# l& b$ G2+5+8+9=24$ k$ _, K' a- v& Z* f 2+6+7+9=24 / \: d7 g- e1 N3+4+7+10=24 , L: y% `: [ o8 q2 ?3+4+8+9=240 a" j2 q6 C- D/ Q9 R5 w 3+5+6+10=24. F$ R/ |7 K$ d/ v$ W 3+5+7+9=24: U/ H. m- l1 ~8 T: C0 { 3+6+7+8=24 + F8 Q' ?% k% ?4+5+6+9=248 c6 [$ h% \9 j/ H, Z& S, y+ B 4+5+7+8=24( @+ o5 {! U9 N% R: S* p 这是什么意思?似乎是找出了 1 至 10 之间的和是24 的数据,这和完成计算24点,差很多吧? , x6 L3 D7 H5 H a v8 a比如用户输入 2 ,5,7,8 程序应该能得到计算这四个数据得到24的表达式才行啊,这样就可以写一个游戏了。 4 H) x Q% p# }1 l7 F如: 1,5,7,8 有如下方法可以算出 24% k e: E7 q5 P+ @; ]; P D ((1+7)-5)*8 = 24 ! E0 ~( r* n! h4 J6 M# m9 J, v((7+1)-5)*8 = 24! L5 R. R0 v8 b9 D0 k (1+7)*(8-5) = 24 + Y* N. F6 q, b: q* F(7+1)*(8-5) = 24# U: D2 ]. [. b6 ~ ((1-5)+7)*8 = 24 {4 Q; D Q% m, Z0 q ((7-5)+1)*8 = 24 9 q2 C% T0 s* i3 }4 o3 v(8-5)*(1+7) = 24 + ~5 i1 Z# k [8 L5 E' O(8-5)*(7+1) = 24 - z% L; z! J6 O; j" d' A8*(1+7-5) = 248 O. D0 v" X, ~' x 8*((1+7)-5) = 24- h* `1 O+ u, \# }" S @' q 8*(1+(7-5)) = 24 ( j4 f( o" T* p j" t8*(7+1-5) = 24 4 L0 d# F6 y* Y+ z1 _8*((7+1)-5) = 24, S$ u* O8 f% R 8*(7+(1-5)) = 24 8 ?6 E, G+ G( S1 x8*(1-5+7) = 24: }* p+ I: S$ T4 K5 \ 8*((1-5)+7) = 24 % ?8 G$ Y" n! u$ v8*(7-5+1) = 241 |. P" R: b$ P7 [% g d 8*((7-5)+1) = 24& w" E& M0 |* `# q

    该用户从未签到

    13
    发表于 2004-5-2 15:21:00 | 只看该作者
    结果是这样的:3 H$ B! @/ X: B
    1+4+9+10=244 y# I8 `2 o9 t( r2 K( K0 L
    1+5+8+10=24* I0 R  d0 [1 q3 \2 h% X  S0 [
    1+6+7+10=24; ]5 o* J1 R" J) E" K9 a
    1+6+8+9=24
    ; V$ u4 ?) W$ i( c/ |" r5 F2+3+9+10=24
    ' h. C. @4 p: W6 H1 H9 y+ a2+4+8+10=24' T. e& u. \* I, I% v' T1 B
    2+5+7+10=24' o/ K: s; e! p$ e' A8 Y
    2+5+8+9=24
    1 D! G  ^/ v0 a2+6+7+9=24
    9 d9 \; z+ ?% v; ^* ^# O$ f3+4+7+10=24
    2 U6 `- y' G# U& ~) @) w/ T* S3+4+8+9=249 f: J7 Q' [7 d
    3+5+6+10=24& N: |/ I$ s! z$ D5 G
    3+5+7+9=243 B( X% b5 V0 q
    3+6+7+8=248 \# {! S) [. Y" p' D
    4+5+6+9=24
    * S& P* @- H) o5 Y; g4+5+7+8=245 ]/ T6 g8 c; S' R7 C
    1*5+9+10=24" S% y; `$ l6 c9 p* o' K
    1*6+8+10=24
    - Y! }, R9 V, v9 d; f2 H, h8 d1*7+8+9=24
    . q3 Y2 l9 g6 g1 L2*3+8+10=24
    / ?: Z# c$ V8 ^( Y! G2 j2*4+6+10=24- j" K4 I& B( ]2 N  O
    2*4+7+9=24
    5 [0 E0 x: h4 |# ^# P+ j2*5+6+8=24) D4 k' k2 ~8 S, l
    3*4+5+7=243 i3 {7 L& R5 I% q! f5 N; B
    4*5-6+10=24
    # d7 S% M- T! C1 v& k/ V3 x0 S+ q(1+2)*5+9=24
    % ?6 w5 r, v2 g" _  E; N(1+3)*4+8=24( ~' O: d' J. ?+ u- [  Y# y
    1*2*7+10=24
    $ }7 K1 l% n, e' s; Y7 W9 X1*3*5+9=24
    4 ]8 b( n* H- F4 f6*7-8-10=24
    ; [) I* `" ~2 z- Y& p2 a3 p(2+4)*5-6=24
    6 o1 q3 v4 f% G8 G7 ]' J* k4 w" h8 s2*3*5-6=24
    - W/ }: g. M! t( z+ L5 |* I! B2 P(1+2+3)*4=241 m* T* J) ~# A
    (1-2+4)*8=24- y+ S9 E0 d; W6 q
    (1-2+5)*6=247 P6 H: S6 g) v' S% [2 `
    (1-3+5)*8=24
    ; L- e$ x- Y& W/ x(1-4+6)*8=243 p" L8 b7 {% h8 a) \
    (1-5+7)*8=24
    " a: C+ l; ]. r; d6 w% H8 d5 [, a6 h(2-3+4)*8=24
    7 |( L- o. w0 B4 P9 j5 w' F) t(2-3+5)*6=24
    ; W7 x% H8 l2 o(2-4+5)*8=24; I$ S3 G% {5 f7 ^9 W3 [4 ~$ d
    (2-5+6)*8=241 p8 {0 u4 l. g8 P8 n
    (2-6+7)*8=24( }9 I: e! M3 [! b9 v' a
    (3-4+5)*6=24
    ' U% K. a/ z1 O+ d1 z0 ~(4+5-6)*8=24
    1 \( D- x- h9 b) p(4+6-7)*8=24
    ; p, j3 q+ [3 d' B" j8 ~0 J' s(2*4-5)*8=24
    2 |' I6 |3 c& U; [! [) S# E4 `(2*5-7)*8=24) D; o/ t: C1 |! u4 [' C( w
    1*2*3*4=240 u' `, O- |+ w+ u4 b* |% Q
    1/2*6*8=24
    & ]: r0 N' U5 q$ p3 e/ C+ ?+ G: |6 Y1/3*8*9=24% c/ [& k8 ]& ^+ L7 D( H! ~
    2/3*4*9=24
    1 g& b6 q. J: _1 r2/4*6*8=24
    8 W( I1 ?% D! z! k$ T- K- {& m5 |" E2/5*6*10=24  L4 G% ]3 A* S3 }2 W( \- g
    2/6*8*9=24( u8 ^2 ?# l/ ^7 T
    3*4/5*10=24" N# b$ ~7 x9 N; l; w" y
    5*6*8/10=24
    : t8 `) F& [: |2 J总计57个式子

    该用户从未签到

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

    [LV.1]初来乍到

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

    [LV.1]初来乍到

    16
    发表于 2004-5-2 15:28:00 | 只看该作者
    (2-1)*3*8 这个算式你就没有啊,这4个数字的组合都没有出现9 M+ l( L- t. r5 X7 u
    ! m0 ]. r$ m' E

    7 c4 i7 |6 j) n, b3 g9 i* p! l, |/ E; U+ I

      j  \4 E6 Q2 z/ q4 D
    , q( s; [' P) s# f4 j$ {5 Q: y  j+ n/ d5 I4 _( B2 r
    [此贴子已经被作者于2004-5-2 15:32:12编辑过]

    9 s1 l. r- s! I5 Q
  • 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 | 只看该作者
    ' A1 j. w3 u2 T; p# h' [

    4 N  {! g8 v9 T5 ?. g用这个好了,只不过输入的时候要按从小到大
    7 o" J& W, N+ T1 L- G' s8 g5 i: B3 g; C9 s$ {
    好象有BUG,我暂时不太清楚

    该用户从未签到

    20
    发表于 2004-5-2 15:38:00 | 只看该作者
    以下是引用yzhlinux在2004-5-2 15:28:15的发言:
    8 I) k0 {' X4 L- j4 J" L(2-1)*3*8 这个算式你就没有啊,这4个数字的组合都没有出现
    ; L  `( Y4 p6 |9 V" D7 g
      V' K% N5 s: z5 N* g, t
    本来为了防止诸如
    " u! K6 Y. a5 F# c% L& }1*2*3*42 l3 b' d; ~0 J
    1*3*4*2
    8 j. ?- [; @: e1 J" F8 D2*3*4*1
    & |( v) m- C; N/ T( n0 n9 y  S等的重复,只使用了从小到大的数组,不过这样好象也丢了不少可行的式子
    # [6 M6 b' |2 F, ~& d& n* a% o( B  D
    另外你的程序就是有这些重复的
    ' @2 r! b' [. z; i/ W( J
    ( D: U; K: X1 \+ ^PS:VB的程序感觉就是慢好多啊9 T3 U# T) F( l$ W
    [此贴子已经被作者于2004-5-2 15:42:01编辑过]
    6 c+ c/ _% N; c

    本版积分规则

    关闭

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

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