- 论坛徽章:
- 0
|
#include "stdio.h"
#include "stdlib.h"
#include "memory.h"
#include "math.h"
#include "string.h"
void ok(double input[],char str[][50],int no,double jg);
int cnmnext(int cnm[],int no,int js){
for(int i=js-1;i>=0;i--)
if(cnm[i]<no-js+i){
cnm[i]++;
for(int j=i+1;j<js;j++)cnm[j]=cnm[i]+j-i;
return 1;
}
return 0;
}//cnm的状态
void change(double input[],char str[][50],int cnm[],int no,double t){
for(int i=0,j=0;i<no;i++){
if(i==cnm[0] || i==cnm[1])continue;
input[j]=input[i];
strcpy(str[j++],str[i]);
}
strcpy(str[j],str[no]);
input[j]=t;
}//得到下一ok函数的输入
void cal(char str[][50],char sth[][50],double input[],double temp[],int cnm[],int no,double jg,char ch,int flg)
{
double t;
memcpy(str,sth,50*no);
memcpy(input,temp,sizeof(double)*no);
switch(ch){
case '+':t=input[cnm[flg]]+input[cnm[(flg+1)%2]];break;
case '*':t=input[cnm[flg]]*input[cnm[(flg+1)%2]];break;
case '-':t=input[cnm[flg]]-input[cnm[(flg+1)%2]];break;
case '/':
if(fabs(input[cnm[(flg+1)%2]]-0)>0.001){
t=input[cnm[flg]]/input[cnm[(flg+1)%2]];
}
else return;
}
sprintf(str[no],"(%s%c%s)",str[cnm[flg]],ch,str[cnm[(flg+1)%2]]);
change(input,str,cnm,no,t);
ok(input,str,no-1,jg);
}
void ok(double input[],char str[][50],int no,double jg){
if((no==1) ){
if(fabs(input[0]-jg)<0.0001)printf("%s = %f\n",str[2],input[0]);
return;
}
char sth[10][50];
int cnm[2]={0,1};
double temp[10];
memcpy(sth,str,50*no);
memcpy(temp,input,sizeof(double)*no);
do{
cal(str,sth,input,temp,cnm,no,jg,'+',0);
cal(str,sth,input,temp,cnm,no,jg,'*',0);
cal(str,sth,input,temp,cnm,no,jg,'-',0);
cal(str,sth,input,temp,cnm,no,jg,'-',1);
cal(str,sth,input,temp,cnm,no,jg,'/',0);
cal(str,sth,input,temp,cnm,no,jg,'/',1);
}while(cnmnext(cnm,no,2));
}
main()
{
double input[]={3,6,6,10,5,7};//要计算的数组1,5,6,8.5,6,7,9,6
char str[10][50]={0},ch[50];
for(int i=0;i<10;i++){//初始化str
gcvt(input[i],8,ch);
strcpy(str[i],ch);
}
//input存储数组,str存储结果,数组前no个数任意组合得到jg的结果
ok(input,str,6,24);
}
|
|
|