您的位置:首页 > 其它

递归法算24

2005-09-20 23:40 148 查看
/*************************************************/
/* 算24 */
/* 皮业勇 */
/* 2005.9.20 */
/* piyeyong@gmail.com */
/*************************************************/
#include<stdio.h>
#define N 4
#include<math.h>
float cun
[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
;
work(b, n-1);
}
}
}
}
}
void main()
{
int i;
float a
;

for(i=1; i<=N; i++)
scanf("%f",&a[i]);
work(a, N);
return;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: