2011 - 公式构造

    给两个数x,y,构造公式a op1 b op2 c op3 d。其中a,b,c,d四个数中,两个数为x,两个数为y,op1,op2,op3可以为+,-,*。该公式运算方法如下,从左到右计算,无视运算符优先级。给x,y和答案,问有多少种构造公式的方法?

注:公式中7个元素(a,b,c,d,op1,op2,op3)有一个元素不一样则表示两个公式不一样。

题目输入

一行输入三个数字:x,y,ans,ans为答案。其中-100<=x,y<=100,-100000000<=ans<=100000000.

题目输出

每个测试数据输出一个数,表示构造公式的方法数。

输入/输出样例

题目输入

7 8 16

题目输出

9

提示

8 + 8 + 7 - 7

8 + 7 + 8 - 7

7 + 8 + 8 - 7

8 + 8 - 7 + 7

8 + 7 - 7 + 8

7 + 8 - 7 + 8

8 - 7 + 8 + 7

8 - 7 + 7 + 8

7 - 7 + 8 + 8

C++解答

#include<stdio.h>
#include<math.h>
#include<string.h>
#include<iostream>
#include<algorithm>
using namespace std;
int a[6][4];
int main()
{
    int x,y,ans;
    while(scanf("%d%d%d",&x,&y,&ans)!=EOF)
    {
        long long t=0;
        int co=0;
      a[0][0]=a[0][1]=x;
      a[0][2]=a[0][3]=y;
      for(int i=1;i<6;i++)
      {
          for(int j=0;j<4;j++)
            a[i][j]=a[0][j];
      }
      swap(a[1][0],a[1][2]);
      swap(a[1][1],a[1][3]);
      swap(a[2][1],a[2][2]);
      swap(a[3][1],a[3][3]);
      swap(a[4][0],a[4][2]);
      swap(a[5][0],a[5][3]);
      for(int i=0;i<6;i++)
      {
          for(int q=0;q<3;q++)
          for(int w=0;w<3;w++)
                for(int e=0;e<3;e++)
              {  t=a[i][0];
                     if(q==0)
                    t+=a[i][1];
                  else if(q==1)
                   t-=a[i][1];
                  else t*=a[i][1];
                  if(w==0)
                    t+=a[i][2];
                  else if(w==1)
                   t-=a[i][2];
                  else t*=a[i][2];
                  if(e==0)
                    t+=a[i][3];
                  else if(e==1)
                   t-=a[i][3];
                  else t*=a[i][3];
                 if(t==ans)
                   co++;
               //   cout<<co<<endl;
              }


      }
      printf("%d\n",co);

    }
}

提示

8 + 8 + 7 - 7

8 + 7 + 8 - 7

7 + 8 + 8 - 7

8 + 8 - 7 + 7

8 + 7 - 7 + 8

7 + 8 - 7 + 8

8 - 7 + 8 + 7

8 - 7 + 7 + 8

7 - 7 + 8 + 8

时间限制 1 秒
内存限制 128 MB
讨论 统计
上一题 下一题