代码: 全选
#include <stdio.h>
#include <malloc.h>
#include <math.h>
#include <stdlib.h>
#define V 64422
#define W 0.000001
double ys(double n1, double n2, int fh) {
if (fh == 0) {
return(n1+n2);
} else if (fh == 1) {
return(n1-n2);
} else if (fh == 2) {
return(n1*n2);
} else if (n2 != 0 && fh == 3) {
return(n1/n2);
}
return V;
}
char dq(int fh) {
if (fh == 0) {
return '+';
} else if (fh == 1) {
return '-';
} else if (fh == 2) {
return '*';
} else if (fh == 3) {
return '/';
}
}
int* str(int n) {
int arr[4] = {1, 1, 1, 1};
int i;
int *s;
int a=(n-1)/6,b,c,d;
s=(int*)malloc(sizeof(int)*4);
n++;
arr[a] = 0;
b = (n%6)/2;
if (b>=a) {
b++;
}
arr[b] = 0;
if (n%2 == 1) {
for (i=3; i>=0; i--) {
if (arr[i] == 1) {
c = i;
d = 6-a-b-c;
}
}
s[0]=a;
s[1]=b;
s[2]=c;
s[3]=d;
return s;
}
for (i=0; i<4; i++) {
if (arr[i] == 1) {
c = i;
d = 6-a-b-c;
}
}
s[0]=a;
s[1]=b;
s[2]=c;
s[3]=d;
return s;
}
void jsgc(double arr[], int jg){
int arri[4];
int i,j,x,y,z;
double **ysbl;
int *ysf1;
int *ysf2;
int *ysf3;
double *ys1;
double *ys2;
double *ys3;
double *ys4;
double num = 0;
int *s;
s=(int*)malloc(sizeof(int)*4);
ysbl=(double**)malloc(sizeof(double)*64*jg);
ysf1=(int*)malloc(sizeof(int)*64*jg);
ysf2=(int*)malloc(sizeof(int)*64*jg);
ysf3=(int*)malloc(sizeof(int)*64*jg);
ys1=(double*)malloc(sizeof(double)*64*jg);
ys2=(double*)malloc(sizeof(double)*64*jg);
ys3=(double*)malloc(sizeof(double)*64*jg);
ys4=(double*)malloc(sizeof(double)*64*jg);
for (j=0; j<64*jg; j++) {
ysbl[j] = (double*)malloc(sizeof(ysbl)*5);
}
for (j=0; j<jg; j++) {
s = str(j);
for (x=0; x<4; x++) {
arri[s[x]] = x;
}
for (x=0; x<4; x++) {
for (y=0; y<4; y++) {
for (z=0; z<4; z++) {
ysbl[j*64+x*16+y*4+z][0] = ys(ys(ys(arr[arri[0]], arr[arri[1]], x), arr[arri[2]], y), arr[arri[3]], z);
ysbl[j*64+x*16+y*4+z][1] = ys(ys(arr[arri[0]], arr[arri[1]], x), ys(arr[arri[2]], arr[arri[3]], z), y);
ysbl[j*64+x*16+y*4+z][2] = ys(ys(arr[arri[0]], ys(arr[arri[1]], arr[arri[2]], y), x), arr[arri[3]], z);
ysbl[j*64+x*16+y*4+z][3] = ys(arr[arri[0]], ys(ys(arr[arri[1]], arr[arri[2]], y), arr[arri[3]], z), x);
ysbl[j*64+x*16+y*4+z][4] = ys(arr[arri[0]], ys(arr[arri[1]], ys(arr[arri[2]], arr[arri[3]], z), y), x);
ysf1[j*64+x*16+y*4+z] = x;
ysf2[j*64+x*16+y*4+z] = y;
ysf3[j*64+x*16+y*4+z] = z;
ys1[j*64+x*16+y*4+z] = arr[arri[0]];
ys2[j*64+x*16+y*4+z] = arr[arri[1]];
ys3[j*64+x*16+y*4+z] = arr[arri[2]];
ys4[j*64+x*16+y*4+z] = arr[arri[3]];
}
}
}
}
for (i=0; i<jg*64; i++) {
if ((double)ysbl[i][0]>(double)jg-W&&(double)ysbl[i][0]<(double)jg+W) {
num++;
printf("((%lf%c%lf)%c%lf)%c%lf\n",ys1[i],dq(ysf1[i]),ys2[i],dq(ysf2[i]),ys3[i],dq(ysf3[i]),ys4[i]);
}
if ((double)ysbl[i][1]>(double)jg-W&&(double)ysbl[i][1]<(double)jg+W) {
num++;
printf("(%lf%c%lf)%c(%lf%c%lf)\n",ys1[i],dq(ysf1[i]),ys2[i],dq(ysf2[i]),ys3[i],dq(ysf3[i]),ys4[i]);
}
if ((double)ysbl[i][2]>(double)jg-W&&(double)ysbl[i][2]<(double)jg+W) {
num++;
printf("(%lf%c(%lf%c%lf))%c%lf\n",ys1[i],dq(ysf1[i]),ys2[i],dq(ysf2[i]),ys3[i],dq(ysf3[i]),ys4[i]);
}
if ((double)ysbl[i][3]>(double)jg-W&&(double)ysbl[i][3]<(double)jg+W) {
num++;
printf("%lf%c((%lf%c%lf)%c%lf)\n",ys1[i],dq(ysf1[i]),ys2[i],dq(ysf2[i]),ys3[i],dq(ysf3[i]),ys4[i]);
}
if ((double)ysbl[i][4]>(double)jg-W&&(double)ysbl[i][4]<(double)jg+W) {
num++;
printf("%lf%c(%lf%c(%lf%c%lf))\n",ys1[i],dq(ysf1[i]),ys2[i],dq(ysf2[i]),ys3[i],dq(ysf3[i]),ys4[i]);
}
}
if(num==0)printf("无答案\n");
else printf("共有%lf种方法\n",num);
}
void main(){
double arr[4];
printf("请输入4个小于14的数,数与数之间用空格分开:");
scanf("%lf%lf%lf%lf",&arr[0],&arr[1],&arr[2],&arr[3]);
jsgc(arr,24);
}