自创C语言填表式编码风格。欢迎大家用各种语言及其编码风格来PK!C语言自由的编码风格是一把双刃剑。用不好会
自创C语言填表式编码风格。欢迎大家用各种语言及其编码风格来PK! C语言自由的编码风格是一把双刃剑。 用不好会千人千面;用好了能结出下面这朵“奇葩”:(^_^) 大家谁感兴趣可以试试在完成相同功能的前提下用各种语言及其编码风格来PK一下。
//定义下面5种运算顺序: // ((A @ B) @ C) @ D // (A @ B) @ (C @ D) // (A @ (B @ C)) @ D // A @ ((B @ C) @ D) // A @ (B @ (C @ D)) //23.99<计算结果<24.01 //其中: //1≤A、B、C、D≤13 //@为“+、-、*、/”之一 //用浮点数计算,循环遍历以上所有情况即可。 #include <stdio.h> int A,B,C,D,N; float r,r1,r2; char op1,op2,op3; char opc[4]={'+','-','*','/'}; void main() { N=0; for (A=1;A<=13;A++) { for (B=1;B<=13;B++) { for (C=1;C<=13;C++) { for (D=1;D<=13;D++) { for (op1=0;op1<4;op1++) { for (op2=0;op2<4;op2++) { for (op3=0;op3<4;op3++) { // ((A @ B) @ C) @ D r=(float)A; switch (op1) {case 0:r =r +B ;break;case 1:r =r -B ;break;case 2:r =r *B ;break;case 3:r =r /B ;break;} switch (op2) {case 0:r =r +C ;break;case 1:r =r -C ;break;case 2:r =r *C ;break;case 3:r =r /C ;break;} switch (op3) {case 0:r =r +D ;break;case 1:r =r -D ;break;case 2:r =r *D ;break;case 3:r =r /D ;break;} if (23.99f<r && r<24.01f) {N++;printf("%8d: ((%2d%c%2d)%c%2d)%c%2d=24\n",N,A,opc[op1],B,opc[op2],C,opc[op3],D);} // (A @ B) @ (C @ D) r1=(float)A; switch (op1) {case 0:r1=r1+B ;break;case 1:r1=r1-B ;break;case 2:r1=r1*B ;break;case 3:r1=r1/B ;break;} r2=(float)C; switch (op3) {case 0:r2=r2+D ;break;case 1:r2=r2-D ;break;case 2:r2=r2*D ;break;case 3:r2=r2/D ;break;} switch (op2) {case 0:r =r1+r2;break;case 1:r =r1-r2;break;case 2:r =r1*r2;break;case 3:if (-0.01f<r2 && r2<0.01f) goto STEP3; r=r1/r2;break;} if (23.99f<r && r<24.01f) {N++;printf("%8d: (%2d%c%2d)%c(%2d%c%2d)=24\n",N,A,opc[op1],B,opc[op2],C,opc[op3],D);} // (A @ (B @ C)) @ D STEP3: r=(float)B; switch (op2) {case 0:r =r +C ;break;case 1:r =r -C ;break;case 2:r =r *C ;break;case 3:r =r /C ;break;} switch (op1) {case 0:r =A +r ;break;case 1:r =A -r ;break;case 2:r =A *r ;break;case 3:if (-0.01f<r && r <0.01f) goto STEP4; r=A /r ;break;} switch (op3) {case 0:r =r +D ;break;case 1:r =r -D ;break;case 2:r =r *D ;break;case 3:r =r /D ;break;} if (23.99f<r && r<24.01f) {N++;printf("%8d: (%2d%c(%2d%c%2d))%c%2d=24\n",N,A,opc[op1],B,opc[op2],C,opc[op3],D);} // A @ ((B @ C) @ D) STEP4: r=(float)B; switch (op2) {case 0:r =r +C ;break;case 1:r =r -C ;break;case 2:r =r *C ;break;case 3:r =r /C ;break;} switch (op3) {case 0:r =r +D ;break;case 1:r =r -D ;break;case 2:r =r *D ;break;case 3:r =r /D ;break;} switch (op1) {case 0:r =A +r ;break;case 1:r =A -r ;break;case 2:r =A *r ;break;case 3:if (-0.01f<r && r <0.01f) goto STEP5; r=A /r ;break;} if (23.99f<r && r<24.01f) {N++;printf("%8d: %2d%c((%2d%c%2d)%c%2d)=24\n",N,A,opc[op1],B,opc[op2],C,opc[op3],D);} // A @ (B @ (C @ D)) STEP5: r=(float)C; switch (op3) {case 0:r =r +D ;break;case 1:r =r -D ;break;case 2:r =r *D ;break;case 3:r =r /D ;break;} switch (op2) {case 0:r =B +r ;break;case 1:r =B -r ;break;case 2:r =B *r ;break;case 3:if (-0.01f<r && r <0.01f) continue; r=B /r ;break;} switch (op1) {case 0:r =A +r ;break;case 1:r =A -r ;break;case 2:r =A *r ;break;case 3:if (-0.01f<r && r <0.01f) continue; r=A /r ;break;} if (23.99f<r && r<24.01f) {N++;printf("%8d: %2d%c(%2d%c(%2d%c%2d))=24\n",N,A,opc[op1],B,opc[op2],C,opc[op3],D);} } } } } } } }
} // 1: (( 1+ 1)+ 1)* 8=24 // 2: ( 1+( 1+ 1))* 8=24 // 3: ( 1+ 1)*( 1+11)=24 // ... ... // 53280: (13+13)/(13/12)=24 // 53281: (13-(13/13))+12=24 // 53282: 13-((13/13)-12)=24
[解决办法] 先膜拜一下赵老师
[解决办法] 风格是种信仰
[解决办法] 顶一个的LZ。。。。赵老师,就是非常之有风格。
[解决办法] 速算24...支持下
[解决办法] 膜拜赵老师
[解决办法] C++ 的
#include<stdio.h> #include<algorithm> using namespace std; typedef float ( __cdecl *TYPE_MYFUN )( float , float ); float FunAdd( float x, float y ) { return x + y; } float FunSub( float x, float y ) { return x - y; } float FunMul( float x, float y ) { return x * y; } float FunDiv( float x, float y ) { return x / y; } int main( int argc, char* argv[] ) { float Num[4] = { 3 , 3 , 8 , 8 };//答案为 8/(3-8/3) ; //float Num[4] = { 5 , 5 , 5 , 1 };//答案为5/(5-(1/5)); sort( Num , Num + 4 ); static char op[4] = { '+' , '-' , '*' , '/'}; TYPE_MYFUN Fun[4] = { FunAdd , FunSub , FunMul , FunDiv }; do { for( int x = 0 ; x < 4 ; x++ ) { for( int y = 0 ; y < 4 ; y++ ) { for( int z = 0 ; z < 4 ; z++ ) { float sum = Fun[z]( Fun[y]( Fun[x]( Num[0], Num[1] ) , Num[2] ) , Num[3] ); if( ( sum > 23.9 ) && ( sum < 24.1 ) ) { printf( "((%d%c%d)%c%d)%c%d", ( int )Num[0], op[x] , ( int )Num[1], op[y] , ( int )Num[2], op[z], ( int )Num[3] ); return 0; } sum = Fun[z]( Fun[x]( Num[0], Num[1] ) , Fun[y]( Num[2] , Num[3] ) ); if( ( sum > 23.9 ) && ( sum < 24.1 ) ) { printf( "(%d%c%d)%c(%d%c%d)", ( int )Num[0], op[x] , ( int )Num[1], op[z] , ( int )Num[2], op[y], ( int )Num[3] ); return 0; } sum = Fun[z]( Num[0] , Fun[y]( Num[1] , Fun[x]( Num[2], Num[3] ) ) ); if( ( sum > 23.9 ) && ( sum < 24.1 ) ) { printf( "%d%c(%d%c(%d%c%d))", ( int )Num[0], op[z] , ( int )Num[1], op[y] , ( int )Num[2], op[x], ( int )Num[3] ); return 0; } } } } }while( next_permutation( Num , Num + 4 ) ); return 0; }
[解决办法] 好膜拜赵老师
[解决办法] 膜拜赵老师
[解决办法] for (A=1;A<=13;A++) { for (B=1;B<=13;B++) { for (C=1;C<=13;C++) { for (D=1;D<=13;D++) { for (op1=0;op1<4;op1++) { for (op2=0;op2<4;op2++) { for (op3=0;op3<4;op3++) {
这个几个for没层次感,看着不舒服吧,个人意见。
[解决办法] #include <stdio.h> float Number[4]; char Option[3]; char OptionList[4] ={ '+', '-', '*', '/'}; int N = 0; float FuncSwitch(float A, int Opt, float B) { float Ret; switch (Opt) { case '+' : Ret = A + B;break; case '-' : Ret = A - B;break; case '*' : Ret = A * B;break; default : Ret = (B > -0.01f && B < 0.01f) ? -12345678.9 : A / B;break; } return Ret; } void FuncCalcul() { float r; r = FuncSwitch(FuncSwitch(FuncSwitch(Number[0], Option[0], Number[1]), Option[1], Number[2]), Option[2], Number[3]); if (23.99f<r && r<24.01f) {N++;printf("%8d: ((%2d%c%2d)%c%2d)%c%2d=24\n",N,(int)Number[0],Option[0],(int)Number[1],Option[1],(int)Number[2],Option[2],(int)Number[3]);} r = FuncSwitch(FuncSwitch(Number[0], Option[0], Number[1]), Option[1], FuncSwitch(Number[2], Option[2], Number[3])); if (23.99f<r && r<24.01f) {N++;printf("%8d: (%2d%c%2d)%c(%2d%c%2d)=24\n",N,(int)Number[0],Option[0],(int)Number[1],Option[1],(int)Number[2],Option[2],(int)Number[3]);} r = FuncSwitch(FuncSwitch(Number[0], Option[0], FuncSwitch(Number[1], Option[1], Number[2])), Option[2], Number[3]); if (23.99f<r && r<24.01f) {N++;printf("%8d: (%2d%c(%2d%c%2d))%c%2d=24\n",N,(int)Number[0],Option[0],(int)Number[1],Option[1],(int)Number[2],Option[2],(int)Number[3]);} r = FuncSwitch(Number[0], Option[0], FuncSwitch(FuncSwitch(Number[1], Option[1], Number[2]), Option[2], Number[3])); if (23.99f<r && r<24.01f) {N++;printf("%8d: %2d%c((%2d%c%2d)%c%2d)=24\n",N,(int)Number[0],Option[0],(int)Number[1],Option[1],(int)Number[2],Option[2],(int)Number[3]);} r = FuncSwitch(Number[0], Option[0], FuncSwitch(Number[1], Option[1], FuncSwitch(Number[2], Option[2], Number[3]))); if (23.99f<r && r<24.01f) {N++;printf("%8d: %2d%c(%2d%c(%2d%c%2d))=24\n",N,(int)Number[0],Option[0],(int)Number[1],Option[1],(int)Number[2],Option[2],(int)Number[3]);} } void FuncOption(int OptionCount) { int i = 0; if(OptionCount == 3) { FuncCalcul(); } else { for (i = 0; i <= 3; i++) { Option[OptionCount] = OptionList[i]; FuncOption(OptionCount + 1); } } } void FuncNumber(int NumberCount) { int i = 0; if (NumberCount == 4) { FuncOption(0); } else { for (i = 1; i <= 13; i++) { Number[NumberCount] = (float)i; FuncNumber(NumberCount + 1); } } } int main() { FuncNumber(0); return 0; }
无聊了瞎搞...个人习惯..
[解决办法] 这种风格还是第一次看到。。很另类
[解决办法] 还是 python 的看起来更简洁~~~
from __future__ import division operator = ('+', '-', '*', '/') N = 1 def factors(): for A in xrange(1, 14): for B in xrange(1, 14): for C in xrange(1, 14): for D in xrange(1, 14): yield A, B, C, D def opers(): for op1 in xrange(0, 4): for op2 in range(0, 4): for op3 in range(0, 4): yield operator[op1], operator[op2], operator[op3] def check_res(fmt, A, B, C, D, op1, op2, op3): global N sumexp = fmt % (A, op1, B, op2, C, op3, D) try: sum = eval(sumexp) except ZeroDivisionError: return if sum > 23.99 and sum < 24.01: print N, sumexp, "=24" N += 1 def main(): fact = factors() for A, B, C, D in fact: oper = opers() for op1, op2, op3 in oper: # ((A @ B) @ C) @ D check_res("((%d%s%d)%s%d)%s%d", A, B, C, D, op1, op2, op3) # (A @ B) @ (C @ D) check_res("(%d%s%d)%s(%d%s%d)", A, B, C, D, op1, op2, op3) # (A @ (B @ C)) @ D check_res("(%d%s(%d%s%d))%s%d", A, B, C, D, op1, op2, op3) # A @ ((B @ C) @ D) check_res("%d%s((%d%s%d)%s%d)", A, B, C, D, op1, op2, op3) # A @ (B @ (C @ D)) check_res("%d%s(%d%s(%d%s%d))", A, B, C, D, op1, op2, op3) if __name__ == "__main__": main()
[解决办法] 挺美的。
[解决办法] [解决办法] 看着像艺术。。[解决办法] 支持一下,赵老师来论坛也好久了,还是很佩服的引用: 求版主把上面yuluyangguang发错的帖子删除吧。 [解决办法] 引用: 膜拜,收藏,飘过。。。 +1[解决办法] 有好几种书说编码的, <高质量编程><简洁代码>[解决办法] 发现好几位大神来着~[解决办法] 怎一个牛字了得[解决办法] 都是牛人列。。。。。[解决办法] 引用: C/C++ code for (A=1;A<=13;A++) { for (B=1;B<=13;B++) { for (C=1;C<=13;C++) { for (D=1;D<=13;D++) { for (op1=0;op1<4;op1++) { for (op2=0;op2<4;op2++) { for (op3=0;op3<4;o……
同感同感[解决办法] [解决办法] 有一些情况是算不出24的。。 比如4个A和一个2.。。。 要把不可能成功的单独提练出来。。。。 楼主用的穷举,应该把不能算出来的也穷举一遍。。。[解决办法] 我的是用逆波兰用算求的,可是结果只有两万多个而楼主的有5万多个。 希望大家看看有什么地方不对 #include <stdio.h> int rpn (int *); int main (void) { int A, B, C, D, N; int c[8]; int op1, op2, op3; char opc[4] = {'+', '-', '*', '/'}; N = 0; for (A = 1; A <= 13; A++){ for (B = 1; B <= 13; B++){ for (C = 1; C <= 13; C++){ for (D = 1; D <= 13; D++){ for (op1 = 0; op1 < 4; op1++){ for (op2 = 0; op2 < 4; op2++){ for (op3 = 0; op3 < 4; op3++){ c[0] = A; c[1] = B; c[2] = opc[op1]; c[3] = C; c[4] = opc[op2]; c[5] = D; c[6] = opc[op3]; c[7] = 0; if (rpn(c) == 0){ N++; printf ("%8d: ((%2d%c%2d)%c%2d)%c%2d = 24\n", N, A, opc[op1], B, opc[op2], C, opc[op3], D); } c[0] = A; c[1] = B; c[2] = opc[op1]; c[3] = C; c[4] = D; c[5] = opc[op2]; c[6] = opc[op3]; c[7] = 0; if (rpn(c) == 0){ N++; printf ("%8d: (%2d%c%2d)%c(%2d%c%2d) = 24\n", N, A, opc[op1], B, opc[op3], C, opc[op2], D); } c[0] = A; c[1] = B; c[2] = C; c[3] = opc[op1]; c[4] = opc[op2]; c[5] = D; c[6] = opc[op3]; c[7] = 0; if (rpn(c) == 0){ N++; printf ("%8d: (%2d%c(%2d%c%2d))%c%2d = 24\n", N, A, opc[op2], B, opc[op1], C, opc[op3], D); } c[0] = A; c[1] = B; c[2] = C; c[3] = opc[op1]; c[4] = D; c[5] = opc[op2]; c[6] = opc[op3]; c[7] = 0; if (rpn(c) == 0){ N++; printf ("%8d: %2d%c((%2d%c%2d)%c%2d) = 24\n", N, A, opc[op3], B, opc[op1], C, opc[op2], D); } c[0] = A; c[1] = B; c[2] = C; c[3] = D; c[4] = opc[op1]; c[5] = opc[op2]; c[6] = opc[op3]; c[7] = 0; if (rpn(c) == 0){ N++; printf ("%8d: %2d%c(%2d%c(%2d%c%2d)) = 24\n", N, A, opc[op3], B, opc[op2], C, opc[op1], D); } } } } } } } } return 0; } #define MAXVAL 10 int sp; double val[MAXVAL]; void push (double f) { val[sp++] = f; } double pop (void) { return val[--sp]; } int rpn (int *c) { double op2; int ch; sp = 0; while (1){ ch = *c++; switch (ch){ case '+': push(pop() + pop()); break; case '*': push(pop() * pop()); case '-': op2 = pop(); push(pop() - op2); break; case '/': op2 = pop(); if (op2 != 0.00) push(pop() / op2); else return 1; break; case 0: op2 = pop(); if (23.99 < op2 && op2 < 24.01) return 0; else return 1; break; default: push((double)(ch - 0)); break; } } }[解决办法]
#include <stdio.h> int A,B,C,D,N; float r,r1,r2; char op1,op2,op3; char opc[4]={'+','-','*','/'}; void main() { N=0; for (A=1;A<=13;A++) { for (B=1;B<=13;B++) { for (C=1;C<=13;C++) { for (D=1;D<=13;D++) { for (op1=0;op1<4;op1++) { for (op2=0;op2<4;op2++) { for (op3=0;op3<4;op3++) { // ((A @ B) @ C) @ D r=(float)A; switch (op1) {case 0:r =r +B ;break;case 1:r =r -B ;break;case 2:r =r *B ;break;case 3:r =r /B ;break;} switch (op2) {case 0:r =r +C ;break;case 1:r =r -C ;break;case 2:r =r *C ;break;case 3:r =r /C ;break;} switch (op3) {case 0:r =r +D ;break;case 1:r =r -D ;break;case 2:r =r *D ;break;case 3:r =r /D ;break;} if (23.99f<r && r<24.01f) {N++;printf("%8d: ((%2d%c%2d)%c%2d)%c%2d=24\n",N,A,opc[op1],B,opc[op2],C,opc[op3],D);} // (A @ B) @ (C @ D) r1=(float)A; switch (op1) {case 0:r1=r1+B ;break;case 1:r1=r1-B ;break;case 2:r1=r1*B ;break;case 3:r1=r1/B ;break;} r2=(float)C; switch (op3) {case 0:r2=r2+D ;break;case 1:r2=r2-D ;break;case 2:r2=r2*D ;break;case 3:r2=r2/D ;break;} switch (op2) {case 0:r =r1+r2;break;case 1:r =r1-r2;break;case 2:r =r1*r2;break;case 3:if (-0.01f<r2 && r2<0.01f) goto STEP3; r=r1/r2;break;} if (23.99f<r && r<24.01f) {N++;printf("%8d: (%2d%c%2d)%c(%2d%c%2d)=24\n",N,A,opc[op1],B,opc[op2],C,opc[op3],D);} // (A @ (B @ C)) @ D STEP3: r=(float)B; switch (op2) {case 0:r =r +C ;break;case 1:r =r -C ;break;case 2:r =r *C ;break;case 3:r =r /C ;break;} switch (op1) {case 0:r =A +r ;break;case 1:r =A -r ;break;case 2:r =A *r ;break;case 3:if (-0.01f<r && r <0.01f) goto STEP4; r=A /r ;break;} switch (op3) {case 0:r =r +D ;break;case 1:r =r -D ;break;case 2:r =r *D ;break;case 3:r =r /D ;break;} if (23.99f<r && r<24.01f) {N++;printf("%8d: (%2d%c(%2d%c%2d))%c%2d=24\n",N,A,opc[op1],B,opc[op2],C,opc[op3],D);} // A @ ((B @ C) @ D) STEP4: r=(float)B; switch (op2) {case 0:r =r +C ;break;case 1:r =r -C ;break;case 2:r =r *C ;break;case 3:r =r /C ;break;} switch (op3) {case 0:r =r +D ;break;case 1:r =r -D ;break;case 2:r =r *D ;break;case 3:r =r /D ;break;} switch (op1) {case 0:r =A +r ;break;case 1:r =A -r ;break;case 2:r =A *r ;break;case 3:if (-0.01f<r && r <0.01f) goto STEP5; r=A /r ;break;} if (23.99f<r && r<24.01f) {N++;printf("%8d: %2d%c((%2d%c%2d)%c%2d)=24\n",N,A,opc[op1],B,opc[op2],C,opc[op3],D);} // A @ (B @ (C @ D)) STEP5: r=(float)C; switch (op3) {case 0:r =r +D ;break;case 1:r =r -D ;break;case 2:r =r *D ;break;case 3:r =r /D ;break;} switch (op2) {case 0:r =B +r ;break;case 1:r =B -r ;break;case 2:r =B *r ;break;case 3:if (-0.01f<r && r <0.01f) continue; r=B /r ;break;}
switch (op1) {case 0:r =A +r ;break;case 1:r =A -r ;break;case 2:r =A *r ;break;case 3:if (-0.01f<r && r <0.01f) continue; r=A /r ;break;} if (23.99f<r && r<24.01f) {N++;printf("%8d: %2d%c(%2d%c(%2d%c%2d))=24\n",N,A,opc[op1],B,opc[op2],C,opc[op3],D);} } } } } } } } }
干写这样的代码就得做好被经理骂死的准备[解决办法] 我弱爆了....[解决办法] 该回复于2012-02-08 09:36:43被版主删除 [解决办法] javascript版多方便,浏览器打开就算了。 不止算24另外5个6个数也可以算。 http://jsbin.com/oqokeb/edit#preview http://fiddle.jshell.net/zswang/GaF3G/show/<!DOCTYPE html> <html> <head> <meta http-equiv="content-type" content="text/html; charset=UTF-8"> <title>demo by zswang</title> <script type='text/javascript' src='http://code.jquery.com/jquery-1.6.4.js'></script> <script type='text/javascript'>//<![CDATA[ $(window).load(function(){ function searchExpression(dest, numbers) { if (!numbers) return; var precision = 1e-6; // 精度 var dict = {}; function search(numbers, expressions, level, dest, outputs) { var result; if ((level <= 1) && (Math.abs(numbers[0] - dest) <= precision)) { !dict[expressions[0]] && outputs.push(expressions[0]); dict[expressions[0]] = true; return true; } for (var i = 0; i < level; i++) { for (var j = i + 1; j < level; j++) { var A = numbers[i]; var B = numbers[j]; numbers[j] = numbers[level - 1]; var vExpA = expressions[i]; var vExpB = expressions[j]; expressions[j] = expressions[level - 1]; expressions[i] = '(' + vExpA + '+' + vExpB + ')'; numbers[i] = A + B; if (search(numbers, expressions, level - 1, dest, outputs)) Result = true; expressions[i] = '(' + vExpA + '-' + vExpB + ')'; numbers[i] = A - B; if (search(numbers, expressions, level - 1, dest, outputs)) Result = true; expressions[i] = '(' + vExpB + '-' + vExpA + ')'; numbers[i] = B - A; if (search(numbers, expressions, level - 1, dest, outputs)) result = true; expressions[i] = '(' + vExpA + '*' + vExpB + ')'; numbers[i] = A * B; if (search(numbers, expressions, level - 1, dest, outputs)) result = true; if (B != 0) { expressions[i] = '(' + vExpA + '/' + vExpB + ')'; numbers[i] = A / B; if (search(numbers, expressions, level - 1, dest, outputs)) result = true; } if (A != 0) { expressions[i] = '(' + vExpB + '/' + vExpA + ')';
numbers[i] = B / A; if (search(numbers, expressions, level - 1, dest, outputs)) result = true; } numbers[i] = A; numbers[j] = B; expressions[i] = vExpA; expressions[j] = vExpB; } } return result; } if (typeof numbers == "string") { numbers = numbers.split(/[\s,;g]+/); } var expressions = []; var outputs = []; for (var i = 0; i < numbers.length; i++) { numbers[i] = +numbers[i]; expressions.push(numbers[i]); } search(numbers, expressions, numbers.length, dest, outputs); return outputs; } $("#go").click(function() { var outputs = searchExpression(+$("#dest").val(), $("#inputs").val()); $("#outputs").val(outputs && outputs.join("\n")); }); });//]]> </script> </head> <body> <body> <div> 目标数:<input id="dest" value="24"/> 数组:<input id="inputs" value="10,10,4,4"/><input type="button" id="go" value="计算吧!"/> </div> <div> <textarea id="outputs"></textarea> </div> </body> </html>
[解决办法] javascript -> eval(object)[解决办法] 久闻赵老师大名,百闻不如一见啊[解决办法] 引用: 求版主把上面yuluyangguang发错的帖子删除吧。 发错了也是一种风格[解决办法] 神马。。。。[解决办法] 感觉自己要走的路还很长……[解决办法] 题目有点难------解决方案--------------------
include <stdio.h> float Number[4]; char Option[3]; char OptionList[4] ={ '+', '-', '*', '/'}; int N = 0; float FuncSwitch(float A, int Opt, float B) { float Ret; switch (Opt) { case '+' : Ret = A + B;break; case '-' : Ret = A - B;break; case '*' : Ret = A * B;break; default : Ret = (B > -0.01f && B < 0.01f) ? -12345678.9 : A / B;break; } return Ret; } void FuncCalcul() { float r; r = FuncSwitch(FuncSwitch(FuncSwitch(Number[0], Option[0], Number[1]), Option[1], Number[2]), Option[2], Number[3]); if (23.99f<r && r<24.01f) {N++;printf("%8d: ((%2d%c%2d)%c%2d)%c%2d=24\n",N,(int)Number[0],Option[0],(int)Number[1],Option[1],(int)Number[2],Option[2],(int)Number[3]);} r = FuncSwitch(FuncSwitch(Number[0], Option[0], Number[1]), Option[1], FuncSwitch(Number[2], Option[2], Number[3])); if (23.99f<r && r<24.01f) {N++;printf("%8d: (%2d%c%2d)%c(%2d%c%2d)=24\n",N,(int)Number[0],Option[0],(int)Number[1],Option[1],(int)Number[2],Option[2],(int)Number[3]);} r = FuncSwitch(FuncSwitch(Number[0], Option[0], FuncSwitch(Number[1], Option[1], Number[2])), Option[2], Number[3]); if (23.99f<r && r<24.01f) {N++;printf("%8d: (%2d%c(%2d%c%2d))%c%2d=24\n",N,(int)Number[0],Option[0],(int)Number[1],Option[1],(int)Number[2],Option[2],(int)Number[3]);} r = FuncSwitch(Number[0], Option[0], FuncSwitch(FuncSwitch(Number[1], Option[1], Number[2]), Option[2], Number[3])); if (23.99f<r && r<24.01f) {N++;printf("%8d: %2d%c((%2d%c%2d)%c%2d)=24\n",N,(int)Number[0],Option[0],(int)Number[1],Option[1],(int)Number[2],Option[2],(int)Number[3]);} r = FuncSwitch(Number[0], Option[0], FuncSwitch(Number[1], Option[1], FuncSwitch(Number[2], Option[2], Number[3]))); if (23.99f<r && r<24.01f) {N++;printf("%8d: %2d%c(%2d%c(%2d%c%2d))=24\n",N,(int)Number[0],Option[0],(int)Number[1],Option[1],(int)Number[2],Option[2],(int)Number[3]);} } void FuncOption(int OptionCount) { int i = 0; if(OptionCount == 3) { FuncCalcul(); } else { for (i = 0; i <= 3; i++) { Option[OptionCount] = OptionList[i]; FuncOption(OptionCount + 1); } } } void FuncNumber(int NumberCount) { int i = 0; if (NumberCount == 4) { FuncOption(0); } else { for (i = 1; i <= 13; i++) { Number[NumberCount] = (float)i; FuncNumber(NumberCount + 1); } } } int main() { FuncNumber(0); return 0; } 这个好[解决办法] 是啊,风格也是人为的。。。[解决办法] 好多高手 [解决办法] 再来个稍微bt点的 C++11版的
#include<stdio.h> #include<algorithm> #include<Functional> using namespace std; typedef std::pair<function<float(float,float)>,char> Type; Type f[4] = { Type([](float x,float y ){return x+y;},'+'), Type([](float x,float y ){return x-y;},'-') ,Type([](float x,float y ){return x*y;},'*') , Type([](float x,float y ){return x/y;},'/') }; float Num[4] = { 3 , 3 , 8 , 8 };//答案为 8/(3-8/3) ; int main( int argc, char* argv[] ) { sort( Num , Num + 4 ); do { for_each( f , f+4 , [=](Type x) { for_each( f,f+4, [=](Type y) { for_each( f,f+4, [=](Type z) { float sum = z.first( y.first( x.first( Num[0], Num[1] ) , Num[2] ) , Num[3] ); if( ( sum > 23.9 ) && ( sum < 24.1 ) ) { printf( "((%d%c%d)%c%d)%c%d", ( int )Num[0], x.second , ( int )Num[1], y.second , ( int )Num[2], z.second, ( int )Num[3] ); exit(0); } sum = z.first( x.first( Num[0], Num[1] ) , y.first( Num[2] , Num[3] ) ); if( ( sum > 23.9 ) && ( sum < 24.1 ) ) { printf( "(%d%c%d)%c(%d%c%d)", ( int )Num[0], x.second , ( int )Num[1], z.second , ( int )Num[2], y.second, ( int )Num[3] ); exit(0); } sum = z.first( Num[0] , y.first( Num[1] , x.first( Num[2], Num[3] ) ) ); if( ( sum > 23.9 ) && ( sum < 24.1 ) ) { printf( "%d%c(%d%c(%d%c%d))", ( int )Num[0], z.second , ( int )Num[1], y.second , ( int )Num[2], x.second, ( int )Num[3] ); exit(0); } } ); } ); } ); }while( next_permutation( Num , Num + 4 ) ); return 0; }
[解决办法] 新来的能不能发点不同看法 for (A =1;A <=13;A ++) { for (B =1;B <=13;B ++) { for (C =1;C <=13;C ++) { for (D =1;D <=13;D ++) { for (op1=0;op1< 4;op1++) { for (op2=0;op2< 4;op2++) { for (op3=0;op3< 4;op3++) { 看起来很舒服,但是真要看调试或者修改bug的话,这样的结构似乎不好看出嵌套的层次结构 以上完全我个人看法,[解决办法] 我觉得这只能叫adaption而不是style[解决办法] 引用: C++ 的 C/C++ code #include<stdio.h> #include<algorithm> using namespace std; typedef float ( __cdecl *TYPE_MYFUN )( float , float ); float FunAdd( float x, float y ) { return x + y; } ... 这个代码好引用: 再来个稍微bt点的 C++11版的 ... 就开始用C++11了啊 代码看着眼花缭乱啊[解决办法] 引用: C语言自由的编码风格是一把双刃剑。 用不好会千人千面;用好了能结出下面这朵“奇葩”:(^_^) 大家谁感兴趣可以试试在完成相同功能的前提下用各种语言及其编码风格来PK一下。 C/C++ code //定义下面5种运算顺序: // ((A @ B) @ C) @ D // (A @ B) @ (C @ D) // (A @ (B…… 这个代码这样看起来还行,但是 for (){ int a; int a2; for (){ int dd; for (){ int b; int b1; } for (){ int c; } int d; } callfunc(); for (){ printf(); } } 这样的代码还能分出哪个for是嵌套哪个是并列的么