C语言24点

#include "stdio.h"
#include "math.h"
#define L1(x) sign[x%4]
#define L2(x) sign[(x/4)%4]
#define L3(x) sign[(x/16)%4]
#define M1 "[(%.0lf%c%.0lf)%c%.0lf]%c%.0lf \n"
#define M2 "[%.0lf%c(%.0lf%c%.0lf)]%c%.0lf \n"
#define M3 "%.0lf%c[(%.0lf%c%.0lf)%c%.0lf] \n"
#define M4 "%.0lf%c[%.0lf%c(%.0lf%c%.0lf)] \n"
#define M5 "(%.0lf%c%.0lf)%c(%.0lf%c%.0lf) \n"
#define M6 "(%.0lf%c%.0lf%c%.0lf)%c%.0lf \n"
#define M7 "(%.0lf%c%.0lf)%c%.0lf%c%.0lf \n"
#define M8 "%.0lf%c(%.0lf%c%.0lf%c%.0lf) \n"
#define M9 "%.0lf%c%.0lf%c(%.0lf%c%.0lf) \n"
#define M0 "%.0lf%c(%.0lf%c%.0lf)%c%.0lf \n"
#define N  "%.0lf%c%.0lf%c%.0lf%c%.0lf \n"
#define O  *p,L1(i),*(p+1),L2(i),*(p+2),L3(i),*(p+3)
int input()
    {   int i,k;
        i=k=0;
        do{
            while(i!=110&&i!=121) i=getch();
            if(i!=0&&k==0)putchar(i-32);
            k=getch();
            if(k==8){putchar(8);putchar(0);putchar(8);i=k=0;}
        }while(k!='\r');
        putchar(10);
        return(i);
    }
double fun(double a1,double a2,char mode)
{
    switch(mode){
            case '+': return a1+a2;break;
            case '-': return a1-a2;break;
            case '*': return a1*a2;break;
            case '/': return (a2>0.0001)?a1/a2:10000;break;
        }  
}
void change(double *p,int mode)
{
    double *p1,*p2,temp;
    if(mode%6){
        mode%=3;
        switch(mode)
        {
            case 0: p1=p+2;p2=p+3;break;
            case 1: p1=p+1;p2=p+2;break;
            case 2: p1=p+1;p2=p+3;break;
        }
    }
    else{
        mode/=6;
        p1=p;p2=p+mode;
    }
    temp=*p1;*p1=*p2;*p2=temp;
}
void loop(double *p)
    {   double temp1,temp2,temp3;
        char sign[5] = "+-*/";
        int i=0,a;
        do{ a=0;
            temp1=fun(*p,*(p+1),L1(i));
            temp2=fun(temp1,*(p+2),L2(i));
            temp3=fun(temp2,*(p+3),L3(i));
            if(ceil(temp3)==24) a+=1;
            temp1=fun(*(p+1),*(p+2),L2(i));
            temp2=fun(*p,temp1,L1(i));
            temp3=fun(temp2,*(p+3),L3(i));
            if(ceil(temp3)==24) a+=2;
            temp2=fun(temp1,*(p+3),L3(i));
            temp3=fun(*p,temp2,L1(i));
            if(ceil(temp3)==24) a+=4;
            temp1=fun(*(p+2),*(p+3),L3(i));
            temp2=fun(*(p+1),temp1,L2(i));
            temp3=fun(*p,temp2,L1(i));
            if(ceil(temp3)==24) a+=8;
            temp2=fun(*p,*(p+1),L1(i));
            temp3=fun(temp2,temp1,L2(i));
            if(ceil(temp3)==24) a+=16;
            switch (a){
                case 0:break;
                case 1: printf(M1,O);break;
                case 2: printf(M2,O);break;
                case 3: printf(M6,O);break;
                case 4: printf(M3,O);break;
                case 6: printf(M0,O);break;
                case 8: printf(M4,O);break;
                case 12: printf(M8,O);break;
                case 16: printf(M5,O);break;
                case 17: printf(M7,O);break;
                case 24: printf(M9,O);break;
                default :printf(N,O);break;
            }
        }while(64-i++);
    }
main()
{
    double man[4];
    int yn,k;
    do{
        printf("Please input 4 number:");
        for(k=0;k<4;k++) scanf("%lf",&man[k]);
        k=0;
        while(24-k){
            change(man,k++);
            loop(man);
        }
        printf("Do you want to try it again? Y or N [ ]\b\b");
        fflush(stdin);
        yn=input();
        if(yn=='n') break;
    }while(1);
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值