• 全部
  • 问答

自创C语言填表式编码风格。欢迎大家用各种语言及其编码风格来PK!

赵4老师 某上市公司 系统架构师  2012-02-02 11:18:05
加精
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
...全文
41284 2 收藏 232
写回复
232 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
ytfhwfnh 2014-10-21
编码风格,是为了让阅读的人,很快读懂,不是版式整齐。
回复
这个传送门用的有点多了
回复
qkk123456789 2014-09-10
回复
tuke2010 2014-09-10
回复
赵4老师 2014-06-14
请牢记:源代码本身的书写是否结构化或面向对象或符合设计模式或敏捷…并不重要,重要的是你是否使用结构化或面向对象或符合设计模式或敏捷…的方法命名标识符、阅读、修改、检查、测试源代码。
回复
alwaysalex 2014-06-13
赵老师就是stylish,学习了但是风格问题还得自己确定
回复
qq744056399 2014-06-06
恩 不错 不错 很有学习的价值
回复
赵4老师 2014-05-19
引用 251 楼 jianwen0529 的回复:
感觉是玩文字游戏!!
玩文字游戏谁玩得过《红楼梦》?
回复
赵4老师 2014-05-17
引用 254 楼 qinfenziqiang 的回复:
楼主,你那个STEP是什么语法啊,我学完了C,怎么没见过?
goto语句和label啊
回复
Shield_Wang 2014-05-16
楼主,你那个STEP是什么语法啊,我学完了C,怎么没见过?
回复
HScholar 2014-01-23
C语言初学者。。大一的学生。。刚学完循环。。。表示什么都看不懂。。。。赶脚自己要走的路还很长!!!!
回复
潇潇瑟瑟 2014-01-13
不要迷信书、考题、老师、回帖; 要迷信CPU、编译器、调试器、运行结果。 并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。 任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实! [/quote] “驾船出海时一定只带一个指南针。”这句话挺好的,指南针多了容易乱,意见听多了容易混。
回复
幻夢之葉 2014-01-10
感觉是玩文字游戏!!
回复
wuoomail 2014-01-09
引用 202 楼 wangbao2011_12 的回复:
这么多循环,这么复杂的循环,你用他干啥用啊,这代码谁能看懂,那么多循环,你在做什么精密的高端任务吗。科技,军事等,是什么任务让你把代码写的那么复杂
+1 这样的代码我是绝对不会看的
回复
ooolinux 2014-01-09
速算24点,漂亮。
回复
tinarature 2013-09-25
用调用函数好一点吧,这么长只有你自己看的懂
回复
赵磊 2013-09-01
Alt+F8 ..................
回复
inurlcn 2013-08-06
引用 14 楼 akirya 的回复:
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;
}
这个好
回复
inurlcn 2013-08-06
引用 242 楼 hjgzj 的回复:
表示我如果这么写 代码走查一定不能通过、、
你们公司还有代码走查?
回复
inurlcn 2013-08-06
引用 123 楼 zhupf 的回复:
慢慢开始理解这种风格了. 如果有大量这类计算. 可以写一个代码生成器啥的. 自动排版产生符合要求的表格代码. 当然手工填,得借助Excel这种自动化工具.
回复
相关推荐
发帖
C语言
创建于2007-09-28

6.3w+

社区成员

C语言相关问题讨论
申请成为版主
帖子事件
创建了帖子
2012-02-02 11:18
社区公告
暂无公告