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