递归法算24

/*************************************************/
/*  算24                                         */
/*  皮业勇                                       */
/*  2005.9.20                                    */
/*  piyeyong@gmail.com                           */
/*************************************************/
#include<stdio.h>
#define N 4
#include<math.h>
float cun[N][4];

/* 定义函数f,功能:对m和n进行四则运算,参数b代表四则运算法则(1~6) */
float f(int b,float m,float n)  
{
float c;
if(b==1)
    c=m+n;
else if(b==2)
    c=m-n;
else if(b==3)
    c=m*n;
else if (b==4&&n!=0)
    c=m/n;
else if (b==5&&m!=0)
    c=n/m;
else if(b==6)
    c=n-m;
else
    c=-10000;
return (c);
}

/* 定义函数pf,功能:输出,参数b代表四则运算规则(1~6) */
void pf(int b,float m,float n)   
{if(b==1)
printf("%.3f+%.3f=%.3f/t",m,n,f(1,m,n));
else if(b==2)
printf("%.3f-%.3f=%.3f/t",m,n,f(2,m,n));
else if(b==3)
printf("%.3f*%.3f=%.3f/t",m,n,f(3,m,n));
else if(b==4&&n!=0)
printf("%.3f/%.3f=%.3f/t",m,n,f(4,m,n));
else if(b==5&&m!=0)
printf("%.3f/%.3f=%.3f/t",n,m,f(5,m,n));
else if(b==6&&m!=0)
printf("%.3f-%.3f=%.3f/t",n,m,f(6,m,n));
}

/* 打印结果 */
void print()
{
 for(int i = 1; i < N; i ++)
  pf(cun[i][1],cun[i][2],cun[i][3]);
 putchar('/n');
}

/* 递归的计算,n表示要计算的数的个数,a数组中存放要计算的数 */
void work(float a[], int n)
{
 float b[N+1];
 int l, i;  // i表示四则运算法则

 if(n < 2)
  printf("argument error/n");
 if(n == 2) {
  for(i = 1; i <= 6; i ++)
  {
   if( ((f(i, a[1], a[2]) - 24) < 0.0001) &&
    ((f(i, a[1], a[2]) - 24) > -0.0001 ) )
   {
    // 把本次计算式存入cun二维数组中
    cun[N+1-n][1] = i;
    cun[N+1-n][2] = a[1];
    cun[N+1-n][3] = a[2];
    print();
   }
  }
 }
 else {
  // j,k两个循环表示本次运算a[j],a[k]两个数,运算规则是i(1~6)
  for( int j = 1; j < n; j ++)
  {
   for( int k = j+1; k <= n; k ++)
   {
    for(i = 1; i <= 6; i ++)
    {
     // 把本次计算式存入cun二维数组中
     cun[N+1-n][1] = i;
     cun[N+1-n][2] = a[j];
     cun[N+1-n][3] = a[k];

     // 设置递归时用到的数组b
     for(l = 1; l <=n; l ++)
      b[l] = a[l];
     b[j] = f(i, a[j], a[k]);
     b[k] = a[n];
     work(b, n-1);
    }
   }
  }
 }

}

void main()
{
 int i;
 float a[N];


 for(i=1; i<=N; i++)
  scanf("%f",&a[i]);
 work(a, N);

 return;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值