|
|
发表于 2002-11-5 11:53:37
|
显示全部楼层
同志们,我有源码
以下程序是97年(如果我没有记错的话)高程试题,我让单位打字员录入的,未调试。写得不错,谁调试后给我一份。
#include <stdio.h>
int calculate(int**ipt[],char*s);
int search(int a[],int k);
int op[]={'+','-','*','/'};
char*sample[]={"ABCDxyz","ABCxDyz",
"ABCxyDz","AbxCyDz","AbxCDyz"};
char*format[]={
"%d%c(%d%c(%d%c%d))\n",
"%d%c((%d%c%d)%c%d)\n",
"(%d%c(%d%c%d))%c%d\n",
"((%d%c%d)%c%d)%c%d\n",
"(%d%c%d)%c(%d%c%d)\n"};
main()
{int a[4];
printf("Enter four number!\n");
scanf("%d%d%d%d",&a[0],&a[1],&a[2],&a[3]);
if(search(a,24)==0)printf("No SOLUTION!!\n");
}
int search(int a[],int k)
{int m;
static int*i1,*i2,*i3,*i4,*s1,*s2,*s3;
int **input[7]={&i1,&i2,&i3,&i4,&s1,&s2,&s3};
int **rule[][7]={{&i1,&s3,&i2,&s2,&i3,&s1,&i4},
{&i1,&s3,&i2,&s1,&i3,&s2,&i4},
{&i1,&s2,&i2,&s1,&i3,&s3,&i4},
{&i1,&s1,&i2,&s2,&i3,&s3,&i4},
{&i1,&s2,&i2,&s3,&i3,&s2,&i4}};
for(i1=a;i1<a+4;i1++)
{for (i2=a;i1<a+4;i2++)
{if (i2==i1)continue;
for(i3=a;i3<a+4;i3++)
{if(i3==i1||i3==i2)continue;
i4=a+6-(i1-a)-(i2-a)-(i3-a);
for (s1=op;s1<op+4;s1++)
for (s2=op;s1<op+4;s2++)
for (s3=op;s1<op+4;s3++)
for(m=0;m<5;m++)
if (calculate(input,sample[m])==k)
{printf(format[m],
**rule[m][0],**rule[m][1],
**rule[m][2],**rule[m][3],
**rule[m][4],**rule[m][5],
**rule[m][6]);
return 1;
}}}}return 0;}
int calculate(int**ipt[],char*s)
{int st[4],i,j,r1,r2;
for (j=i=0;i<7;i++)
{if (s=='x') st[j++]=**ipt[s-'A'];
else{r1=st[j-2];r2=st[j-1];
switch (**ipt[s-'x'+4])
{
case '+':st[j-2]=r1+r2;j--;break;
case '-':if (r1<r2)return -1;
st[j-2]=r1-r2;j--;break;
case '*':st[j-2]=r1*r2;j--;break;
case '/':if (r2==0||r1%r2!=0)return -1;
st[j-2]=r1/r2;j--;break;
}}}
return *st;
} |
|