给我说下这个24点程序的算法,急

来源:百度知道 编辑:UC知道 时间:2024/09/24 03:59:18
#include<stdio.h>
#include<math.h>

int treat(float a,float b,float c,float d);
float myF(int flag,float m,float n);
void myPrint(int type,int i,int j,int k,float a,float b,float c,float d);

int time,temp=0;
void main()
{
int i,j,k,t,again,res,flag;
float num[4];
again=1;
while(again==1)
{
printf ("\nPlease Enter 4 nums(1~13):\n");
i=0;
flag=0;
while (flag==0)
{
i++;
// printf ("Input num-%d\n",i);
for(i=0;i<4;i++)
{
scanf("%f",&num[i]);
if (num[i]<1 || num[i]>13 || num[i]!=int(num[i]))
flag++;
}
if(flag!=0)
{
printf ("Error input again\n",i);
flag=0;
}
else
flag=1;
}
for (i=0;i<4;i++)
for (j=0;j<4;j++)
if (j!=i)
for (k=0;k<4;k+

首先我们看看程序的主过程main(),第一步,让用户输入四个1-13的数字,这步比较简单。第二步,见到四个for循环,看起来有点吓人,其实是把这四个数字重新排列组合,获得所有先后排列的次序。(个人认为这里用for并不是十分好的算法,其实还有更好的,这个以后有机会可以继续讨论)这里主要是把四个数字的下标顺序改变,那么num[i],num[j],num[k],num[t]实际上就有了不同的次序了。(其实我所说的更好的办法是直接交换它们的值,这样循环的次数可以少得多)。第三步,把重新排列的四个数字推进treat中进行计算。res用于设立一个是否能获得计算结果的标记,如果res为0,则表示没有结果。四个数要进行三步运算才能得出最后结果,所以该过程使用了sum1,sum2,sum3来临时存放这些中间结果。每两个数之间的计算有+-*/四种,这些将会使用myf来计算。该函数使用for循环来穷举四个数之间三次运算中每次运算的+-*/四种计算。如果最后计算出来的结果是24,那么就会使用myprint来打印计算方法。
myf是个用于返回+-*/四种运算的结果的函数。三个参数中flag标记有五种,分别是加减乘除和被除,其中后面两种,若除数为0就返回30000,以避免出错。m和n分别是左运算数和右运算数。例如,如果myf(1,3,4),则返回3-4(即-1)。
myprint的设计比较巧妙。它用type来表示表达式的结构。如果用%来表示+-*/中的任意一个运算符,abcd表示四个运算数(这些数字已经在main中被重新排列),那么必然只有a%b%c%d、(a%b)%c%d、a%(b%c)%d等五种。四个数之间的三个运算符用i,j,k表示,四个运算数用abcd表示。其中i,j,k取值012345分别是+-*/、负号和被除。

字太多一次发不完上另一个号再发后面的

// printf ("sum1:myF(%d,%2.0f,%2.0f) sum1=%f\n",i,a,b,sum1);
// printf ("sum2:myF(%d,%2.0f,%2.0f) sum2=%f\n",j,c,d,sum2);
// printf ("2