算24的所有可能,考虑交换律等冗余

#include <stdio.h>
#include <string.h>
#include <math.h>
#define N 400
#define U 24.0
#define NS 100
char c[]={'+','-','*','/','^','@'
         ,'&','|','<','>'};
float f[N];char g[N-1];
int u[N+N-1];
int M;int n;
float polan(int *d,int k)
{int m=0,i;
 float v[N],v1,v2;
 for(i=k-1;i>=0;i--)
 {
  if(d[i]<n)v[m++]=f[d[i]];
  else
   {
    v2=v[--m];
    v1=v[--m];
    switch(g[d[i]-n])
    {
      case '+':if(v1>v2)return U-4;
          v[m++]=v1+v2; break;
      case '-':if(v1-v2<0)return U-2;
          v[m++]=v1-v2; break;
      case '*':if(v1>v2)return U-5;
          v[m++]=v1*v2; break;
      case '/':if(v2==0)return U-3;
          v[m++]=v1/v2; break;
      case '^':v[m++]=pow(v1,v2);break;
      case '@':v[m++]=pow(v1,1/v2);break;
      case '&':if((int)v1!=v1||(int)v2!=v2||v1>v2)return U-6;
        v[m++]=(int)v1&(int)v2;break;
      case '|':if((int)v1!=v1||(int)v2!=v2||v1>v2)return U-7;
        v[m++]=(int)v1|(int)v2;break;
      case '<':if(v2<=0||v2>31||(int)v1!=v1||(int)v2!=v2)return U-8;
        v[m++]=(int)v1<<(int)v2;break;
      case '>':if(v2<=0||v2>31||(int)v1!=v1||(int)v2!=v2)return U-9;
        v[m++]=(int)v1>>(int)v2;
       break;
    }
   }
  }
 return v[0];
}
int printp(int *d,int k)
{int m=0,i;
 char s[N][NS],s1[NS],s2[NS];
 for(i=k-1;i>=0;i--)
 {  
  if(d[i]<n)sprintf(s[m++],"%5.2f",f[d[i]]);
  else
   {
    strcpy(s2,s[--m]);
    strcpy(s1,s[--m]);
    sprintf(s[m++],"(%s%c%s)",s1,g[d[i]-n],s2);
   }
  }
  printf("%s=%5.2f\n",s[0],U); 
return 0;
}

void swap(int*a,int*b)
{ int j=*a;*a=*b;*b=j;}
int judge(int m,int b,int c,
           int *b1,int *c1)
{
int k;
if(u[m-1]>=n)
  for(k=m;k<n+n-1;k++)
    if(u[k]>=n)
      if(u[k]>u[m-1])return 0;
    
   if(u[m-1]<n){*b1=b+1;*c1=c;}
   else {*b1=b;*c1=c+1;}     
     if(*c1>=*b1)return 0;

if(u[m-1]<n)
 for(k=m;k<n+n-1;k++)
  if(u[k]<n&&f[u[k]]==f[u[m-1]])      
        if(u[k]>u[m-1])return 0;
 return 1;
}


int q(int m)
{
  int i;
  if(m==0) return 1;
  for(i=0;i<M;i++)
   {
     g[m-1]=c[i];
     if(q(m-1))
       if(polan(u,n+n-1)==U)
           printp(u,n+n-1);
   }
  return 0;
}
 int p(int m,int b,int c)
{
  int i,b1,c1;
  if(m==0) return 1; 
  for(i=0;i<m;swap(u+i,u+m-1),i++)
  {
   swap(u+i,u+m-1);
   if(!judge(m,b,c,&b1,&c1))continue;
   if(p(m-1,b1,c1))q(n-1);
   }
  return 0;
}
int main()
{
 float v;
 int i;
 printf("input how many:");
 scanf("%d",&n);
 if(n<0){n=-n;M=10;}else M=4;
 for(i=0;i<n;i++)
 {
    printf("%d:",i+1);
    scanf("%f",f+i);
 }
 for(i=0;i<n+n-1;i++)u[i]=i;
 p(n+n-1,0,0);
return 0;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值