TA的每日心情 | 奋斗 2015-9-17 00:58 |
---|
签到天数: 1 天 [LV.1]初来乍到
|
以下是引用游侠无极限在2004-5-2 14:41:26的发言:
' s3 A9 ?+ l6 \$ C" ~5 P# {2 H#include 8 k( A9 V, d5 X# [; b9 S
#include
: B& Q1 r! ^( H6 S. b% T* K
7 k C* Z i0 C/ M* W, t int EnumFormula(int min,int max,int num,int sum);! ?. t4 j1 x, }* V! n/ X/ o
void ShowFormula(int *Num,int *Sym,int count,int sum);+ M& d2 e+ W) p' P7 k
double GetFormulaVal(int *Num,int *Sym,int count);) a1 Z4 h3 Y3 o6 N
int EnumArray(int *Num,int min,int max,int count);
U+ y+ n' m5 _ void InitArray(int *Num,int min,int max,int count);4 P, p! c) S! X @+ A/ J! N+ B+ I; [
const char cSym[5] = {0,'+','-','*','/'};1 _+ ~( i2 v& A' R5 f" u
* n; @% C$ u) o2 t/ `! B0 \3 V int main(int argc, char *argv[])
' Z# f O ^8 n. C9 S6 G; i {" f/ k5 L* ^' w8 S$ o8 t q( O7 O' f
printf("总计%d个式子\n",EnumFormula(1,10,4,24));! I) E( K8 ^; I, x s% g$ ~
system("AUSE");
# n2 k! k# n" e% R+ |/ m return 0;
" \8 m& ?3 C0 ^( ~( I }7 m1 D) e* F& i/ J% w
8 u" `# ?( r* v0 W+ v) S int EnumFormula(int min,int max,int num,int sum)
) J+ M0 q& g( Z( x( N2 x {
5 o$ @3 D0 t, X6 x- ~% A6 w4 v int *FormulaNum = (int*)calloc(num,sizeof(int)); //储存操作数
* b1 X+ U O) I //储存操作符号3 ~2 r3 D+ d7 C, Y
//最后一位用于穷举结束标记9 X0 W9 u _5 p8 [8 Y; q# o
// 1 - 4 代表 '+' '-' '*' '/'
. Q: u0 i! i5 @( R! x7 a int *FormulaSym = (int*)calloc(num,sizeof(int));( e' M8 z2 O! N+ N
9 R; A9 g/ w, |( I3 U, C1 L int result = 0;
8 r: h, F# ]3 `- Z% M" O/ P // 初始化操作数和操作符号数组! M5 I* b( W) B9 U# ^6 J
+ ~' Y" B- _$ g- _ int i;
' e+ c3 ~) ?! F: M$ z4 K( n/ p9 m8 \9 z
for(i=0;i = min;# M, e$ N/ _( q9 s
for(i=0;i = 1;
5 T0 d5 s. d; Z9 i" \. x' k" D FormulaNum[0]--;5 |, b' I3 q+ ]0 Z+ |6 V8 c
( C* `, u' j' K6 z InitArray(FormulaNum,min,max,num);
4 J5 @/ k$ I+ x' [6 s) r FormulaNum[num-1]++;
- R: G+ B; \* a5 d // 穷举操作数和操作符号组合: X. S" a$ H, x0 w! J# F
while(FormulaSym[num-1] == 1)
9 O- \) _5 E/ s8 z {$ W2 O+ v* _8 P3 W
double t = GetFormulaVal(FormulaNum,FormulaSym,num) - sum;
7 V$ @2 \- L9 x. x4 s4 ?0 J if(t>-0.01 && t<0.01)
" d+ G4 A9 O: x+ V {
. u8 o: H; e* z1 t( g9 | //printf("%d %d %d %d | %d %d %d ",FormulaNum[0],FormulaNum[1],
6 t; L7 W! |$ }3 N2 l. K //FormulaNum[2],FormulaNum[3],
+ l% L# B6 Y( K8 t; E7 W // FormulaSym[0],FormulaSym[1],
# l7 b4 k L7 [& X' ?1 C4 H1 D0 w // FormulaSym[2],FormulaSym[3]);
# B( `. D. H" w' W ShowFormula(FormulaNum,FormulaSym,num,sum);% z! \7 ~1 z4 Z8 N
result++;
$ M0 h9 |' _2 h) W }
3 c7 ]) I1 u5 p8 A9 T! ] 2 F$ F1 t# w. h. M* e a
// 依次穷举操作数
% Q j4 J, b' R1 W
, @; i$ B+ v1 z //允许数字重复的穷举; q F6 }, X2 @ r- w
//FormulaNum[0]++;
9 q4 W. j4 G5 X/ S+ H" @# ` //for(i=0;FormulaNum > max && i; }. l0 D- R" s4 b. e& d7 X. G
//{" i( W8 u/ H* B* e7 W5 V: [
// FormulaNum = min;
) G5 p: ?7 m* i0 j l9 }/ x2 Z+ n- b // FormulaNum[i+1]++;* n4 o* A0 y. h- v/ x
//}
% J4 U( l. h/ m3 w$ X @ // 操作数穷举与操作符号穷举联接
( g/ ?, @( J1 P7 r //if(FormulaNum[num-1] > max)
7 n" S8 @/ L! N5 N- T% d# r5 s //{9 o6 e+ U0 E" Y' E+ U ^3 [2 J( o
// FormulaNum[num-1] = min;# _4 u) e- j7 Y# n* E7 A
// FormulaSym[0]++;
/ h f/ [1 ]* S //}* q, ]% V9 d, _( _% o# ]) f( s% ~
A; x, r- s+ a6 z* u2 `) [
// 不允许数字重复的穷举0 v7 @- A. m J% A& t& p
// 数字必须从小到大的排列,防止重复6 [7 X( h: n" Q q" G* I0 I7 k
if((max - min)< num) exit(0); // 出错2 m& T9 U! F) }
2 E- e# W) m9 F! h6 g. o4 R3 R) c
if(EnumArray(FormulaNum,min,max,num))
! M5 C+ {- H+ n0 g: t) K/ s {
4 A% D. H, E3 o# | FormulaSym[0]++;+ e7 j4 |$ P3 y' D! ]
InitArray(FormulaNum,min,max,num); |6 b' w& m/ y) g2 O
FormulaNum[num-1]++;
. q/ E4 O, g# _" c$ L1 ^ z4 n }' |6 N* O3 d+ ?
) m$ t$ N) _ `" H- f // 操作符号穷举
3 N U& q e) r% z) j for(i=0;FormulaSym > 4 && i- ~! ~* T/ L$ ?! J8 C+ }
{
4 ^8 R, p0 u, v+ t FormulaSym = 1;6 C4 y" O; o1 D/ f' I) }) g+ q( `
FormulaSym[i+1]++;1 @5 h! W1 I N1 g; a
}0 n; o! f6 k2 f( x
D8 t, V7 A2 g6 P3 {! F }; i6 V! ]" _5 o2 s
//释放空间: {' z3 v& s2 n' q) `- B
free(FormulaNum);
! E' @! R9 S L free(FormulaSym);
# {% b; e" t1 f. r return result;
; u7 `; R* B" C' t- {- T }$ S" G, h4 V- G$ \3 g9 ^
// 计算算式结果1 l; q9 J+ _! z6 L4 c0 @# U- Z. z
double GetFormulaVal(int *Num,int *Sym,int count)% @' K9 H) T' p Z
{- `/ C5 X. {+ ~: F4 [
int i,j;( x% J$ j7 M4 L$ M' x) G
double preresult;
5 P( E* e$ f3 ]* p' Q x preresult = Num[0];
: p8 Z7 q% M' v1 q! _: } i=1;j=0;
* r% r1 e0 |0 R) L% @" Q# O while(i8 T( u( n) c* g% ~ {8 P% k, A4 P7 G1 [
switch(Sym[j])5 F1 D/ w' `* c) ~/ N1 C" Y
{
5 G3 t7 w k% q( S3 i6 o2 q/ v1 k case 1:
4 B2 ~, Q) G' o4 z8 M preresult += Num;& ]8 x1 Y! f6 Y) u- L0 S
break;7 L& o$ {$ k: W
case 2:# [& H- D3 W' x% O) `/ w
preresult -= Num;
X1 t- Z. V! N B, K% ?7 e3 p8 a break;* P; M# y( O$ N; m# E V1 u. l
case 3:
6 L6 c. G" w' N* l preresult *= Num;; B( _2 k+ z4 W9 b8 ~
break;- G( P/ |" r5 {) T. H7 `* I6 T* d
case 4:, l0 Z! W2 h: s
if(Num == 0) return -1000;- u1 @4 V7 F5 t
preresult /= Num;
9 j& o/ G7 _" w" |) T break;
% E' }8 u# r% W+ G7 e2 r }
7 Z6 |1 p2 K" b i++;j++;0 ?: y; o: M4 t0 Y* _2 D r V8 f
}7 l) F# Q( W' r( J6 t4 ]9 a
return preresult; //进行修正4 R$ ]' @3 s7 X! `! O
}
# K, q! y: y. [ Y! w* U // 打印算式
$ h* Q& \: t U: Q( H5 A8 t+ ? void ShowFormula(int *Num,int *Sym,int count,int sum): F: ?0 O0 M0 p u8 B
{7 @' O: W% l2 h' i
9 A! g% x% U1 U* F* c
int i,j,len;' }' F9 U7 n: l1 d: ?7 t& J5 _
char *Formula = (char*)calloc(count*4,sizeof(char));4 z" T: {& [9 P5 t U
char temp[10];
; y# Q4 b. G9 G2 ~) @0 {+ d; r0 @ itoa(Num[0],Formula,10);: F1 Q5 g+ S- ? `: q
i=1;j=0;
) ~# Y' t4 @7 Y0 H% i8 h* n while(i: Q7 |$ j+ S0 \2 B" e {
# ]7 C9 F# i9 G, w, L9 I itoa(Num,temp,10);- z6 m1 U! z. W' _3 P
len = strlen(Formula);
. ~$ t$ m# R F2 |, C ~ switch(Sym[j])
4 r* @: b) m- c, j! u& Y7 c4 I {
, ?# h* `' Z& @6 U9 ` case 1:
- v8 x. T0 v7 |0 r case 2:
0 o K& |" W0 W Formula[len] = cSym[Sym[j]];. \. e" _6 s% x3 M
strcat(Formula,temp);* L: q0 C' n m- y5 x
break;
9 D4 ~% o! P0 _ case 3:" C% |" x' o E3 c% {* j l! }
case 4:( A# C$ p- X9 ?7 m" c' [
% Z/ C3 V1 b8 V% }/ y
// 如果上一个操作符号优先级低于当前的,应加上括号
+ b$ B2 T( G, ]# k if(j==0 || Sym[j-1] > 2)! q/ k5 | F- Z' n) Q c: \& M$ ~
{
+ a f& N% D9 j7 r7 F Formula[len] = cSym[Sym[j]];% Q0 z2 T; ^. o4 K
strcat(Formula,temp);
6 a( B; P5 }" g5 R8 Y3 i" K }: t! t$ V2 @3 b4 D/ Y+ ]/ E8 Q
else, a- C+ m$ y0 [9 G
{2 L3 G: M3 S! M: t
int n;
: f& J% W' M$ a6 v3 |- B" T, j' ]4 G char *FormulaTemp = (char*)calloc(len+1,sizeof(char));7 S2 w- \0 v/ k1 ~* Y5 {
for(n=0;n- B, t: Y) ~( O& d {1 p" M" C' D1 ^( O* y2 `' m8 n
FormulaTemp[n] = Formula[n];
% D- q3 |- x% ~6 \( u. g Formula[n] = 0;! F l7 V; ~) D# p' c
}( B* j, ]- D [2 N2 M! M
Formula[0] = '(';
7 G* K( O# L* `$ i' U strcat(Formula,FormulaTemp);7 g6 s9 K) L2 m0 |- r) J
free(FormulaTemp);, Q0 u) p8 i" o% N
Formula[len+1] =')';5 H$ ?4 G( x% n; P& h7 e$ Y3 c
Formula[len+2] = cSym[Sym[j]];
`# J, ~/ n5 D' ~3 } strcat(Formula,temp);, |# W$ S: Q; A5 R. J# D
}
; u2 @$ d% R4 x* l1 r, Q7 v+ U break;
O2 a! ]! l2 z1 X% E5 i8 f! z+ Z }
4 P: r: ^2 c2 _$ k' s i++;j++;4 D" g/ R! J0 g0 z
}
9 q* q! \# \: \( r) @5 W0 W" g printf("%s",Formula);# D, v4 P8 P3 G* C
printf("=%d\n",sum);& @6 E2 C* x+ _" ]# S p
free(Formula);) A( E* h5 ^( t |
}
: A: ?! q: }2 f) ~; u0 f+ d2 U1 T4 e+ O3 q# f4 z
// 以当前数组为基础得到一个从小到大排列的数组
* g- G8 n; y1 `! q+ k2 x // 返回非0表示穷举结束
$ {. W5 A3 c7 H* {9 ? int EnumArray(int *Num,int min,int max,int count)
, x! B; v. ~1 W) N5 p& D. N, N {
+ i: L; ^, e3 y* W# D& N: ~ int i,top;3 }# O. [; `) q6 y& s
top = count-1;
4 E% V% e0 o3 n: V Num[top]++;* A7 g% [; t7 K- N( J
while(Num[top]>max-count+top+1 && top>=0), P; {4 K$ }. {/ b7 u \
{
0 W; k& N' f/ o, `& g( \: E top--;1 \# y; r) v* \6 z0 v4 @
Num[top]++;( E2 r+ o- G5 M7 k7 E4 U* o; {: j8 n
}* a: k% O, S7 t8 q
for(i=top+1;i) p0 F) ]) x: m8 o, H. _
{& x5 W& h, q& }0 f7 M0 i5 G! k
Num = Num[i-1]+1;
( v: u4 x; v3 Z6 C }+ @0 N+ ^" s2 d" B: C6 o% v
if(Num[count-1] > max) return 1;6 F! `% C/ O$ _/ `1 f
else return 0;' t1 [6 j' T3 `
}
$ t8 n2 P& w& F; @" f% R3 F& ~7 {8 f. `# n2 g
// 不允许重复的初始化数组
3 p9 o$ S8 w- y$ q1 I+ T8 a void InitArray(int *Num,int min,int max,int count): r: W* {" T P1 g( s2 L
{
9 [& S2 h! s( T9 k+ N4 C int i;8 k4 L: S1 J4 K( ~
for(i=0;i=min+i;
# e0 d0 }# z% [2 V) A Num[count-1]--;* O2 b& {. [" F9 A, R
}' m! t8 o3 b( i- ~
( ^/ q4 D( |- _+ o% H5 x
( W9 k( ^ n4 Z4 |0 l; M6 N) N$ F* B7 d& \6 P: r9 B! ~
& t) ^5 p& R9 l; i. I+ {3 w; L5 u% o [此贴子已经被作者于2004-5-2 14:50:47编辑过] , p7 g1 j% O+ A. m& P4 N; P
% Q4 w7 H9 N! q/ c) a6 `printf("总计%d个式子\n",EnumFormula(1,10,4,24)); 的运行结果是:
- Y& J# }+ e2 n- b% i% W1+4+9+10=24
6 P9 N- }) e: X1+5+8+10=24/ p2 Q/ g+ ?4 t# S
1+6+7+10=249 u# ~8 E9 D5 A" D' f g5 h6 h
1+6+8+9=241 U6 w& k/ s/ F, ~( A* c
2+3+9+10=24
w+ \3 i- F5 n! O) N9 B; Z w2+4+8+10=24% @8 s8 U F% j a$ o
2+5+7+10=24" K* J. d& y; `/ X" k
2+5+8+9=24
: m0 h+ e5 N* ~2+6+7+9=24
1 a! t& D! n% X1 K% x6 K1 A3+4+7+10=24
3 `/ n' O& w8 ?3+4+8+9=24
6 `- M E; Q' X$ s8 M3+5+6+10=24: R5 J2 q$ h2 v5 }
3+5+7+9=24
1 D+ j* [ i+ _) r5 }3+6+7+8=24
/ g4 e6 G$ w( ?2 G4 G' g2 A9 b4+5+6+9=24& g. T k8 V( ?. j# S/ V: Y
4+5+7+8=24 ^" ?/ Q6 l- T/ A/ E9 B, s
这是什么意思?似乎是找出了 1 至 10 之间的和是24 的数据,这和完成计算24点,差很多吧?/ F9 j. ?8 V% X! S2 e' W
比如用户输入 2 ,5,7,8 程序应该能得到计算这四个数据得到24的表达式才行啊,这样就可以写一个游戏了。8 m" z+ H; j% k; B1 B0 ~; b7 ~9 o
如: 1,5,7,8 有如下方法可以算出 24& b: \$ o/ U( o# n3 d
((1+7)-5)*8 = 24 `/ i( T* J0 [9 I
((7+1)-5)*8 = 24
; m$ Y; Q. o# Y" v(1+7)*(8-5) = 24
( x! D. l5 W% `- u3 ](7+1)*(8-5) = 245 j7 C5 j" d3 |+ z: Y+ O: r1 M
((1-5)+7)*8 = 24
5 Y' M1 n) q4 ]3 ?* E6 i$ a$ A6 i7 D((7-5)+1)*8 = 24
& |1 m4 g5 Y6 }( i$ U(8-5)*(1+7) = 24
4 K( R) e; _, V3 g7 N6 A& \(8-5)*(7+1) = 24- Y0 u, Z; K7 n, z$ h; K3 K& S
8*(1+7-5) = 24
/ W4 k( T% ?. e5 k% O7 g- \( Q8*((1+7)-5) = 24# Q) u! M* @! x d% a- b
8*(1+(7-5)) = 24
& p* c9 v* H+ ^+ y8*(7+1-5) = 24
1 c. w' k' g" E4 k8 o; G, C% ~8*((7+1)-5) = 24
! o' i D7 k" @ A8*(7+(1-5)) = 24+ N4 w( N) n% `; ^# N: m+ P0 I3 i# j
8*(1-5+7) = 246 ^1 e; [' K5 L j z6 l! N( w* @
8*((1-5)+7) = 24; Y, }9 ^ p7 n& v
8*(7-5+1) = 244 \6 k2 h5 t; p2 o& u
8*((7-5)+1) = 24
* O$ o" j! E) F6 @1 r% } |
|