24h購物| | PChome| 登入
2009-08-26 07:55:21| 人氣905| 回應0 | 上一篇 | 下一篇

加減乘除問題

推薦 0 收藏 0 轉貼0 訂閱站台

作法 : 暴力DFS (一堆for)

這題尚未確定是正確的...

/***********************************************************/

#include<stdio.h>
#include<stdlib.h>
int n,a;
int num[20];
int tol[20];
int GCD(int a,int b)              
{              
  int temp;              
  while(a%b)                    
   {                    
     temp=a;                    
     a=b;                    
     b=temp%b;                               
   }  
   return b;              
}  
void DFS (int now)
{
   int a;
   
   if(now==n-1)
     {
       int value[20][2]={0},top=1;
       value[0][0]=num[0];
        for(a=0;a<n;a++)  value[a][1]=1;
       printf("%d",num[0]);
        for(a=0;a<n-1;a++)
           {
             if(tol[a]==1)
                {
                 value[top++][0]=num[a+1];
                 putchar(' ');putchar('+');putchar(' ');
                }
             if(tol[a]==2)
                {
                 value[top++][0]=num[a+1]*-1;
                 putchar(' ');putchar('-');putchar(' ');
                }
             if(tol[a]==3)
                {
                 value[top-1][0]*=num[a+1];
                 int g=GCD(value[top-1][1],abs(value[top-1][0]));
                 value[top-1][1]/=g;
                 value[top-1][0]/=g;
                 putchar(' ');putchar('*');putchar(' ');
                }
             if(tol[a]==4)
                {
                 value[top-1][1]*=num[a+1];
                 int g=GCD(value[top-1][1],abs(value[top-1][0]));
                 value[top-1][1]/=g;
                 value[top-1][0]/=g;
                 putchar(' ');putchar('/');putchar(' ');
                }
             printf("%d",num[a+1]);
           } 
        int sum=0,lcm=1;
        for(a=0;a<top;a++)
             lcm=lcm*abs(value[a][1])/GCD(abs(value[a][1]),lcm);
        for(a=0;a<top;a++)
             value[a][0]=lcm/abs(value[a][1])*value[a][0];
        for(a=0;a<top;a++)
             sum+=value[a][0];
        if(sum%lcm==0)
         printf(" = %d\n",sum/lcm);
        else
         { 
           putchar(' ');putchar('=');putchar(' ');
            if(sum<0) {sum=sum*-1;putchar('-');}
            int g=GCD(sum,lcm);
            sum/=g;
            lcm/=g;
            
            printf("%d/%d\n",sum,lcm);
         }
     } 
   else
   for(a=1;a<=4;a++)
      {
       tol[now]=a; 
       DFS(now+1);
      }
}
main()
{
 /* freopen("in.txt", "rt", stdin);
 freopen("output.txt", "w+t", stdout); */
  while(scanf("%d",&n)==1&&n!=0)
      {
         for(a=0;a<n;a++)
            scanf("%d",&num[a]);
         DFS(0);
      }
 return 0;
}

台長: 來源不明
人氣(905) | 回應(0)| 推薦 (0)| 收藏 (0)| 轉寄
全站分類: 數位資訊(科技、網路、通訊、家電) | 個人分類: ZeroJudge 基礎+原創題庫 |
此分類下一篇:五則運算 (無須轉後序版)
此分類上一篇:我飽了

是 (若未登入"個人新聞台帳號"則看不到回覆唷!)
* 請輸入識別碼:
請輸入圖片中算式的結果(可能為0) 
(有*為必填)
TOP
詳全文