快算24的解法

快算24

Time Limit: 1000MS
Memory Limit: 65536K
Total Submissions: 4646
Accepted: 2851

Description

给定4个不大于10的正整数(范围1-10),要求在不改变数据先后顺序的情况下,采用加减乘除四种运算,找到一个表达式,使得最后的结果是24。

Input

4个不大于10的正整数。输入数据保证存在唯一解。

Output

不改变位置顺序,由'+','-','*','/'4个运算符和'(',')'组成的表达式

Sample Input

5 5 1 5

Sample Output

5*(5-(1/5))

   关于这个题,说说自己的想法,乍一看比较麻烦,但是以现在我学的知识来做确实比较麻烦尴尬,不说别的就是说加括号的方式也就是运算的先后顺序就有5种,要写5个if语句,当时很庆幸只有4个数字。。。。。。。。我直接计算的,注释都在程序里,大家可以看一下吐舌头

#include "stdio.h"
#include "string.h"
void xunzhao(double a,double b,double c,double d);
int jisuan1(double a,double b,double c,double d,int i,int j,int k);
double jisuan2(double a,int i,double b);
int main()
{   double a,b,c,d;//由题目可知两个整数相除是要取小数的,所以干脆都取double型
    while(scanf("%lf%lf%lf%lf",&a,&b,&c,&d)!=EOF)
    xunzhao(a,b,c,d);
    return 0;   
}
void xunzhao(double a,double b,double c,double d)
{   int i,j,k;
    int result;
    for(i=0;i<4;i++)//因为有四种运算,3个运算符,所以有3个循环,每个循环4种情况
    for(j=0;j<4;j++)
          for(k=0;k<4;k++)
          {  result=jisuan1(a,b,c,d,i,j,k);
             if(result)//题目说有唯一解所以找到后直接跳出来就了,进行下一次运算
                break;
          }    
}
char ms[4]={'+','-','*','/'};//ms代表mathematical symbol运算符,需要将i,j,k转换成符号
int jisuan1(double a,double b,double c,double d,int i,int j,int k)
{   int p=0;
    if(jisuan2(jisuan2(a,i,b),j,jisuan2(c,k,d))==24.000000)/*有5种计算方式可以涵盖,因为有唯一解,所以5个if语句并排就行了*/
    {   printf("(%.0lf%c%.0lf)%c(%.0lf%c%.0lf)",a,ms[i],b,ms[j],c,ms[k],d);
        p=1;
    }
    if(jisuan2(jisuan2(a,i,jisuan2(b,j,c)),k,d)==24.000000)
    {   printf("(%.0lf%c(%.0lf%c%.0lf))%c%.0lf",a,ms[i],b,ms[j],c,ms[k],d);
        p=1;
    }
    if(jisuan2(a,i,jisuan2(jisuan2(b,j,c),k,d))==24.000000)
    {   printf("%.0lf%c((%.0lf%c%.0lf)%c%.0lf)",a,ms[i],b,ms[j],c,ms[k],d);
        p=1; 
    }
    if(jisuan2(jisuan2(jisuan2(a,i,b),j,c),k,d)==24.000000)
    {   printf("((%.0lf%c%.0lf)%c%.0lf)%c%.0lf",a,ms[i],b,ms[j],c,ms[k],d);
        p=1;
    }
    if(jisuan2(a,i,jisuan2(b,j,jisuan2(c,k,d)))==24.000000)
    {   printf("%.0lf%c(%.0lf%c(%.0lf%c%.0lf))",a,ms[i],b,ms[j],c,ms[k],d);
        p=1;
     }
     return p;
}
double jisuan2(double a,int i,double b)
{   switch(ms[i])
    {
      case '+':
        return (a+b);break;
      case '-':
        return (a-b);break;
      case '*':
        return (a*b);break;
      default:
        return (a/b);
    }
}


  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值