遞歸法算24

/*************************************************/
/*  算24                                         */
/*  皮業勇                                       */
/*  2005.9.20                                    */
/*  [email protected]                           */
/*************************************************/
#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;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章