TA的每日心情 | 奋斗 2015-9-17 00:58 |
---|
签到天数: 1 天 [LV.1]初来乍到
|
以下是引用游侠无极限在2004-5-2 14:41:26的发言:' b3 a& w1 ^0 T* p4 G
#include - ?5 f; P/ H% j7 e5 \3 h
#include 4 ?3 r1 E( m% d6 }! F% {
: l: B+ `% o6 _0 P% a int EnumFormula(int min,int max,int num,int sum);
: |6 z% M; \+ r: @9 ^ void ShowFormula(int *Num,int *Sym,int count,int sum);
, j( m7 I+ ^6 W9 D4 z9 { double GetFormulaVal(int *Num,int *Sym,int count);. T4 ?# @0 N5 n, Z$ S
int EnumArray(int *Num,int min,int max,int count);$ k* A# U- X* Z8 M( h2 A+ g
void InitArray(int *Num,int min,int max,int count);0 k" z; g3 ~+ |* x
const char cSym[5] = {0,'+','-','*','/'};6 X: d$ n. Z7 a" T
) D% ^% ?! H) k' E! W. { int main(int argc, char *argv[])
$ a# y, \: i! q$ [ {1 m& c7 g2 k# D4 e: Z `9 y
printf("总计%d个式子\n",EnumFormula(1,10,4,24));
' `) f8 h% J8 K+ E3 Z system("AUSE");
* ~0 h7 i; |5 b6 x: g( v7 ^ return 0;
+ R4 P# Q z5 r1 Z" x( ~: s }
+ G+ N+ Z/ m) T; Z' `2 V
$ G5 T& L5 U- t+ f. U7 Y% k [2 L int EnumFormula(int min,int max,int num,int sum)' a' f7 i" n, b
{
9 ~* v& T$ r9 J% b& y# B/ {7 R2 o9 Z int *FormulaNum = (int*)calloc(num,sizeof(int)); //储存操作数
0 `% X' {6 w5 L+ M //储存操作符号
- x$ C( e/ `# N/ C! W# K; b! s //最后一位用于穷举结束标记
2 i4 c8 U6 `6 t* f- X // 1 - 4 代表 '+' '-' '*' '/'
, f& _1 R! F+ |' _) b int *FormulaSym = (int*)calloc(num,sizeof(int));0 f0 ]( \6 n C! Q# @( \/ W/ S
/ s- S, z2 w# V$ c* K# K int result = 0;8 ~4 P4 S: R8 n) p
// 初始化操作数和操作符号数组
% o8 i' I' l6 f3 z3 n. N( b / s0 T% J) t R5 o% A! @1 P
int i;! Z7 l: O- p$ f2 I
, B1 @* K: ?. ]$ E2 x9 K u
for(i=0;i = min;# A: v( ]6 I/ B
for(i=0;i = 1;
9 a, P, w0 M4 r# s7 O% p FormulaNum[0]--;* B- U4 {$ V& \# L% J
+ B$ c' w# s2 z& J2 E; Z- z; Q
InitArray(FormulaNum,min,max,num);* P) G& M. q* z, h4 b6 p8 O0 Z& \4 `
FormulaNum[num-1]++;
+ y- n9 z3 q0 p. Q2 d% } // 穷举操作数和操作符号组合9 `% L! Z$ }& |& C7 C3 ?% N
while(FormulaSym[num-1] == 1)
% ^, z# C K/ k { W$ K2 ?: T. F8 Y* A' f
double t = GetFormulaVal(FormulaNum,FormulaSym,num) - sum;/ M' ^" R5 [) P5 A6 x3 c" Y9 u
if(t>-0.01 && t<0.01)% H Y' y: Z# y
{
7 Y% X2 t8 V0 f //printf("%d %d %d %d | %d %d %d ",FormulaNum[0],FormulaNum[1],: f1 E1 [' R2 f/ U5 m8 h
//FormulaNum[2],FormulaNum[3],) I4 U5 E I5 |2 u% V7 g1 e% x
// FormulaSym[0],FormulaSym[1],
3 ?1 n) Y. R' i( a // FormulaSym[2],FormulaSym[3]);
6 |; l) M. W1 B/ }/ z6 Q ShowFormula(FormulaNum,FormulaSym,num,sum);
; t* s7 f! V0 c" Z) q result++;
' k+ x# D9 N% }0 K }
, o" J* Q0 E$ @1 u
# o- S" p* R! j* U' L // 依次穷举操作数% \' E' G A: V: e* G9 G
4 c7 ?) N& p, b( E* c
//允许数字重复的穷举4 @9 r2 l3 i: Q& B5 v) o
//FormulaNum[0]++;
& X0 |0 L8 D; U2 t4 F2 ^/ ^ //for(i=0;FormulaNum > max && i2 b; v0 q5 p$ W! y6 H( m
//{
0 Z5 O+ e. H5 E7 x // FormulaNum = min;
. K4 d6 \8 q" W) B: V$ @) |$ z2 d // FormulaNum[i+1]++;/ {' _( }5 @- g8 T
//}
8 @0 D' z2 w1 ~6 I w // 操作数穷举与操作符号穷举联接1 J! a8 u# f: A3 \
//if(FormulaNum[num-1] > max)+ |; ?' g& v6 k6 D
//{- R9 r5 U- u/ l4 {0 H9 c: H
// FormulaNum[num-1] = min;
$ Y0 l, M9 Y! R // FormulaSym[0]++;: R) U0 [8 B, x( N) ~
//}% ?: X: {: _" r9 f* q* u3 o
0 H" X# j1 Y3 ~: r/ r& D+ E // 不允许数字重复的穷举
5 O' V& b- h4 w7 j l // 数字必须从小到大的排列,防止重复# ]& O5 `" L% a7 D% V: e
if((max - min)< num) exit(0); // 出错& J7 x1 M( F# z2 R% M+ f) h
) J' K, C7 D: }/ ^
if(EnumArray(FormulaNum,min,max,num))* u$ l2 \& J; H- I1 Q
{ y2 h, g& h9 a5 X* l7 i5 u" Y
FormulaSym[0]++; h9 Y6 x" {; y! F
InitArray(FormulaNum,min,max,num); z3 l- e) q2 W+ ], P- _: j
FormulaNum[num-1]++;9 w* o% T# }/ q2 K7 }- M A
}, s5 Q! b% A: S( f P/ N1 p. l
0 Z6 c) d. q& b3 @" B
// 操作符号穷举1 K: H8 D! \ ?9 }
for(i=0;FormulaSym > 4 && i' c1 P4 @3 x! H( _8 Y- m M& `' [# @
{
' B! L5 L, A( @0 G; j% [ FormulaSym = 1;
: n7 Y( C( ?# c: | FormulaSym[i+1]++;
' p P. i, f: K# \1 ]' v$ Z }0 t) k [! p- ~2 K6 B& K& g
' |: D; L j; ?0 j/ K _
}
. q& j4 x. l( |3 k //释放空间7 ?5 q3 _% u5 u4 D+ U
free(FormulaNum);, H' J" L# C7 |9 d
free(FormulaSym);( Q( Q: v9 j w% E7 \7 W
return result;+ G& Z5 m7 s. z) e6 o! D% n
}
3 g6 b" H" ^: z# m- @ // 计算算式结果
3 P/ r/ S8 n. V8 c; b7 y d" h double GetFormulaVal(int *Num,int *Sym,int count)
! [, x# |5 J7 ?7 } {% Q- Y7 X/ I) Z
int i,j;2 {' J; L* I/ k" `/ R- m. z8 t" [
double preresult;
; K8 t- K9 ~" ^, r preresult = Num[0];
$ G3 W2 v2 p" f4 s5 r! C i=1;j=0;% l1 j, p0 I) G6 M7 B, J& m
while(i9 {1 i! P) V4 L. W0 Q8 Q8 x$ p0 M9 S) {
{* g* e, N# |2 u* ^% E5 A# l: S
switch(Sym[j])
# E& Q. W. Y2 O4 m {2 w \/ i# m+ ?) V( I1 t
case 1:, D$ M* \) V+ O, I
preresult += Num;
5 V+ [8 i" |% V! b6 N) ` break;0 F* W, N# ^8 i8 K3 {
case 2:
4 J$ K" w' e" r; L: }' J1 T" p8 U preresult -= Num;& W( w& n5 _. `; t6 g, e1 N
break;2 n8 a6 [ ]0 l; O, ?1 B% D
case 3:% a( j' `7 C% n7 t* [6 {$ e
preresult *= Num;$ p) r) e! T, F/ e! [
break;
& D( g. U: e" x case 4:
2 K# J1 f, i0 k) n8 o; s if(Num == 0) return -1000;
3 A* S1 L+ O/ u1 F; L) C+ y$ w preresult /= Num;7 o# E" {4 ?; c4 G u
break;/ t6 v4 l9 M, C b u
}$ l* o* \% H- }; p% [( s% i) `
i++;j++;' a- f$ x. }; o
}
# c8 q2 G6 {. I% q# P return preresult; //进行修正
% ^( r' r& e8 ^* q; {3 c+ h }
4 M" m* I8 Q% ]+ z // 打印算式: ~9 E5 i3 \- M4 W. P# r! K; U* i
void ShowFormula(int *Num,int *Sym,int count,int sum)
3 w" W* o2 O9 o {* E- O; [$ r; T& t
0 x) c0 c9 B" i2 t0 u. i int i,j,len;
9 S7 l0 T* D1 d, _9 d' p char *Formula = (char*)calloc(count*4,sizeof(char));1 x2 A- V) a! V! V
char temp[10];
+ f# D; S! j7 [ itoa(Num[0],Formula,10);' q, H' D: g/ ?. {; B( f# I
i=1;j=0;
2 t# v$ d5 {( R$ O5 @" O while(i' R' e$ K- @4 m {
9 k+ Q. U7 `. H* ?# n T! o itoa(Num,temp,10);% p6 F3 Z3 j( _; L4 X# {. n
len = strlen(Formula);
5 x' Z( z8 a+ t. Z; T switch(Sym[j])
5 |. H& U! G& v" B h2 d/ H {+ Q; Z* _4 U# C) M) [
case 1:
2 } N! F0 M5 H7 Y g, H1 N3 _ case 2:
) M' o7 W. Y. o5 n1 C' l Formula[len] = cSym[Sym[j]];
; X' P$ | R1 I T, b: H0 i strcat(Formula,temp);' u4 Z. f' P$ H# j: f" J5 l q
break;
0 {0 e z9 E+ a5 F7 C: B$ J case 3:0 _5 F/ E( R% ^2 R) @
case 4:2 c; P* i7 \" G2 _& }% n
. G2 V: Y8 E( l. C0 P* v2 _8 M/ z& Z // 如果上一个操作符号优先级低于当前的,应加上括号0 Y5 Z9 A5 n5 V" {: q) S
if(j==0 || Sym[j-1] > 2)! |! k7 c- u6 j+ ~! a9 B, ^" n
{$ H9 a4 ?( p4 t- I6 T4 K) ?
Formula[len] = cSym[Sym[j]];0 Z, e( a' v2 L- p% F
strcat(Formula,temp);: p* `1 m4 G8 [4 H% q/ I
}
3 f" M- A" w/ v6 ]9 n else/ z3 o3 _. H/ O9 C' H4 n2 j8 D
{
% F0 ]0 t+ V+ `5 C0 J8 n int n;" x# y: U3 {9 B! q7 T
char *FormulaTemp = (char*)calloc(len+1,sizeof(char));
/ }2 f* _9 v) L# o) i7 y; C2 d' o for(n=0;n) d% C7 v( A, _. S% V) x: H8 q {' g! }! }4 Y9 C/ x
FormulaTemp[n] = Formula[n];: [; Q% a' ? S6 S
Formula[n] = 0;
' m7 f% X9 x6 k# m0 m }& u2 u/ l% u& b2 C
Formula[0] = '(';% @2 A+ C- d Z! L- U7 r
strcat(Formula,FormulaTemp);
: D$ G+ G8 f4 X: ] free(FormulaTemp);2 G& V& g$ \, E+ u: U: h0 p$ d
Formula[len+1] =')';0 i9 \9 F- v4 w3 ~+ g( b& O
Formula[len+2] = cSym[Sym[j]];/ X( {6 t( C; P5 c0 r& Y
strcat(Formula,temp);
8 }/ P- B- P5 e0 k$ [. J }
. g- M( q+ p8 r6 {) b break;
8 [( ?6 A& W* y. j( q6 b$ t. |. V* }6 {( k }/ d4 J D2 ]+ R& L7 }
i++;j++;
M7 K8 h4 ~% m; \ }8 E: X/ s' \0 R/ z- G
printf("%s",Formula);- Q* Y% j4 G, `& Y% H4 \
printf("=%d\n",sum);$ z* {6 I# S3 \; d4 p- |; s
free(Formula);0 _) r" |5 M7 _: a t4 G1 L
}8 N+ D4 b: b- i- E2 Y
$ j! }0 z: v, _3 ~/ J8 p# | // 以当前数组为基础得到一个从小到大排列的数组3 y( e. X. m4 o8 c7 |/ @ Y7 e3 k
// 返回非0表示穷举结束
$ l4 [+ B6 g: g3 i6 B: C5 @; [8 Z int EnumArray(int *Num,int min,int max,int count)0 D' i- F$ E4 j" H# G
{+ e' O6 W! u9 k* c: z, r* B. @
int i,top;
! I4 x$ ~$ w/ N% o# c' { top = count-1;
, N+ g/ E3 q: x3 ]% Q, Z! D Num[top]++;8 U0 `* E( q. ]" X
while(Num[top]>max-count+top+1 && top>=0)
+ b1 s) N1 E8 q8 a {9 ]+ z$ c/ J: f$ M, C
top--;
5 ]4 `3 X" q$ i" j Num[top]++;. k, I$ z D- a8 c( U
}; U1 G5 P+ L, E1 ?
for(i=top+1;i2 D6 g* X3 [7 W9 J4 z
{0 _. g2 }# w% l
Num = Num[i-1]+1;2 N: i- b6 i% s8 V( `5 Q
}5 `3 t/ O1 v5 A
if(Num[count-1] > max) return 1;
, F! g' k( i9 i3 z( i. v else return 0;
* Y& U# b2 k; Q4 S3 C: O }
% Q/ C+ ^) y1 q8 {1 L. H
' F8 Q; B. r/ a3 m! d* _. s // 不允许重复的初始化数组4 d* }% z5 |/ Y+ w; w- I: M
void InitArray(int *Num,int min,int max,int count)
6 T% L$ {5 p( ?# }: }6 S {
! b" t3 Z* t8 V) M int i;/ F6 k, L6 B/ ?. ^ W
for(i=0;i=min+i;
2 n/ u9 e, t( T7 |& d. G* Q Num[count-1]--;
9 _ @' W# M7 n. c. X @/ A }
( ^ n0 z1 E: P" x3 e" w9 E+ ` x' N6 o# Y/ t( a9 q* ~
# _& D* K5 `7 \4 l- a9 n% U( w
3 d0 l/ e) z/ I% }' ~* v9 c; |
8 u3 Q% S& J7 P0 s [此贴子已经被作者于2004-5-2 14:50:47编辑过]
# O; o. n2 X, U; f5 l% J4 K/ o, w7 O( h3 n0 V i
printf("总计%d个式子\n",EnumFormula(1,10,4,24)); 的运行结果是:+ s+ d6 }8 K* p; K/ s+ X
1+4+9+10=24
5 b, S# V! ^# p5 n( I# s1+5+8+10=24* n; ]( b# |* W# u( h( |- L
1+6+7+10=248 P/ k# |& m) F3 d6 z( C& l" h2 N3 p" Y
1+6+8+9=24
+ U5 k& n7 ^! R% e( |& W! j2+3+9+10=24
0 a( A$ Q- e# u2+4+8+10=245 l1 Q" {/ W( w) G- R8 q
2+5+7+10=24
* M5 ]' ?0 H0 T, T, \2+5+8+9=24* M" M, m* Q8 U1 _9 H
2+6+7+9=245 d. |4 f/ d$ ~$ l% o
3+4+7+10=24
9 q- s- I) m* W7 L$ z. `4 I2 r3+4+8+9=24! p9 W7 R' Z# z. E
3+5+6+10=24' N( ]0 k0 H$ p% H! m1 R3 J% B
3+5+7+9=24* W: Z4 M' o5 X8 `1 _
3+6+7+8=24
# p8 W9 ]3 J7 U- J$ E) x% p6 _2 H0 V4+5+6+9=24
% ]/ z' Q( S% [ C8 T4+5+7+8=240 ~3 L: _ L" S* V% k7 M# _
这是什么意思?似乎是找出了 1 至 10 之间的和是24 的数据,这和完成计算24点,差很多吧?) \0 Y+ f% |' w6 @/ K9 F4 [* P
比如用户输入 2 ,5,7,8 程序应该能得到计算这四个数据得到24的表达式才行啊,这样就可以写一个游戏了。
) h: F, C9 _ n2 T( G: u如: 1,5,7,8 有如下方法可以算出 24 k) }5 i: a% @. o
((1+7)-5)*8 = 24
) D, ]+ L8 R6 m- P: M((7+1)-5)*8 = 244 ~5 Y8 x0 I3 b& r1 U8 F
(1+7)*(8-5) = 24$ J& ~" r1 J# a, G
(7+1)*(8-5) = 244 G. G! x3 D. T7 L4 ` Z5 b! E2 J
((1-5)+7)*8 = 24
' h! i% D- s. r K. r. p+ I((7-5)+1)*8 = 24
+ s2 z$ y* [1 A5 t(8-5)*(1+7) = 24 a% g; N2 ]6 |5 o' M
(8-5)*(7+1) = 24
) X' V) E6 z9 W5 S4 I8*(1+7-5) = 24
: m/ Y; Q) v/ Z: U, S$ n3 D8*((1+7)-5) = 24 B5 J- I0 T3 F* E) p6 ?5 T
8*(1+(7-5)) = 24
& K/ d4 f$ Y6 i) S5 e8*(7+1-5) = 24
5 W, {7 l- a( c8*((7+1)-5) = 24
: ?" U1 [6 U: E# v' k8*(7+(1-5)) = 24) p) ]$ B2 c3 o. v
8*(1-5+7) = 24
5 }+ [7 }6 l2 O' q, E3 d( @8*((1-5)+7) = 24
& m5 `$ z; Q. f% P& o6 W" ~3 v( G8*(7-5+1) = 24
# v5 K. j( Q$ [2 v. d9 E6 Y8*((7-5)+1) = 242 C( t3 y$ R8 Q# y' M5 H! A' O
|
|