题目:
写一个程序要求当输入在整数范围内的一个整数R后, 计算机便会检查,在下式□处能否填上“+”、“-”或“×”号凑成相应等式。如能凑成,则印出所有这些等式的个数。注意,考虑符号的优先级。 1□2□3□4□5□6□7□8□9=R
Input
只有一行,就是一个整数R。
Output
只有一行,就是使等式成立的个数。
Sample Input
20
Sample Output
30
解题思路:
遍历每一个位置可以放的符号的所有情况,计算表达式的值,如果和R相同就计数。
代码:
#include <iostream>
using namespace std;
int r;
int fu[10];
int num[10];
int answ;bool check(){
int ans=0;
for(int i=1;i<=9;i++){
if(!fu[i]){
int beg=i-1;
while(!fu[i]){
num[i-1]=0;
num[i]=0;
i++;
if(i>9)break;
}
int cur=1;
for(int j=beg;j<=i-1;j++)cur=cur*j;
ans=ans+cur*fu[beg];
}
}
for(int i=1;i<=9;i++){
if(num[i])ans=ans+num[i]*fu[i];
}
for(int i=1;i<=9;i++)num[i]=i;
if(ans==r)return true;
else return false;
}void f(int a,int x){
fu[a]=x;
if(a==9){
if(check())answ++;
}else{
f(a+1,1);
f(a+1,0);
f(a+1,-1);
}
}int main(){
while(scanf("%d",&r)!=0){
for(int i=1;i<10;i++)num[i]=i;
answ=0;
f(1,1);
cout<<answ<<endl;
}
return 0;
}